Android开发中如何存储自定义对象的ArrayList 避免应用销毁后数据丢失
Kotlin 实现Todo列表持久化方案
你可以使用官方SharedPreferences搭配Gson完成自定义对象列表的持久化,无需复杂配置,兼容性强:
前置准备
- 确保你的
Todo类定义为data class,保证可以正常序列化:
data class Todo( val title: String, val isChecked: Boolean // 对应复选框选中状态 )
- 模块级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
相关产品推荐
相关产品推荐

