You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发中如何存储自定义对象的ArrayList 避免应用销毁后数据丢失

Kotlin 实现Todo列表持久化方案

你可以使用官方SharedPreferences搭配Gson完成自定义对象列表的持久化,无需复杂配置,兼容性强:


前置准备

  1. 确保你的Todo类定义为data class,保证可以正常序列化:
data class Todo(
    val title: String,
    val isChecked: Boolean // 对应复选框选中状态
)
  1. 模块级build.gradle.kts引入Gson依赖(已引入可跳过):
dependencies {
    implementation("com.google.code.gson:gson:2.10.1")
}

新增读写本地存储的工具方法

在你当前的Activity中新增两个私有方法:

// 保存todoList到本地SharedPreferences
private fun saveTodoList() {
    val sharedPref = getSharedPreferences("TodoData", MODE_PRIVATE)
    val editor = sharedPref.edit()
    val jsonStr = Gson().toJson(todoList)
    editor.putString("todo_list_key", jsonStr)
    editor.apply()
}

// 从本地读取已存储的todoList
private fun loadTodoList(): ArrayList<Todo> {
    val sharedPref = getSharedPreferences("TodoData", MODE_PRIVATE)
    val jsonStr = sharedPref.getString("todo_list_key", null)
    val listType = object : TypeToken<ArrayList<Todo>>() {}.type
    // 无本地数据时返回默认初始列表
    return jsonStr?.let { Gson().fromJson(it, listType) } 
        ?: arrayListOf(Todo("Write your first TODO statement", false))
}

修改原有业务逻辑

调整初始化和新增待办的逻辑,关联本地存储:

// 初始化时优先读取本地数据,不直接写死默认值
var todoList = loadTodoList()

val adapter = TodoAdapter(todoList)
binding.rvTodos.adapter = adapter
binding.rvTodos.layoutManager = LinearLayoutManager(this)

binding.btnAddTodo.setOnClickListener {
    val title = binding.etTodo.text.toString()
    if (title.isBlank()) return@setOnClickListener // 过滤空输入
    val newTodo = Todo(title, false)
    todoList.add(newTodo)
    adapter.notifyItemInserted(todoList.size - 1)
    saveTodoList() // 列表修改后立刻同步到本地
    binding.etTodo.text.clear() // 清空输入框优化体验
}

后续扩展注意

  • 后续如果实现待办勾选、删除、修改等操作,每次修改todoList的内容后都调用一次saveTodoList(),即可保证本地数据和界面同步。
  • 该方案仅适合存储小体量的待办数据,如果待办量超过1000条,推荐切换到Room数据库实现。

内容的提问来源于stack exchange,提问作者Shagufta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 17:15:04