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

如何使用TinyDB存储mutableListOf类型列表并解决报错及闪退问题

问题解决步骤

1. 初始参数报错根因

  • 你调用的putListString是专门用来存储List<String>类型的方法,你要存储的是自定义Todo类型的列表,方法类型不匹配
  • 代码里mutableListOf(todoList)是将整个todoList作为单个元素塞进新列表,生成了嵌套的List<List<Todo>>,类型完全不符合参数要求

2. 修改后闪退根因

  • 自定义Todo类未实现Serializable接口,TinyDB无法序列化自定义对象完成存储
  • 调用getListObject获取到的存储列表没有赋值给todoList,读操作完全没生效
  • 存储时写了arrayListOf(todoList),再次生成嵌套的List<List<Todo>>,下次读取时按List<Todo>解析会触发类型转换异常
  • 未对getListObject的返回值做判空处理,首次无存储数据时返回null会触发空指针异常

3. 正确实现代码

首先确保你的Todo类实现Serializable接口:

import java.io.Serializable

data class Todo(val title: String, val isDone: Boolean) : Serializable

再修改业务逻辑代码:

val tinydb = TinyDB(this)

// 读取存储的Todo列表,为空就用默认初始值
var todoList = tinydb.getListObject("TodoList", Todo::class.java)?.toMutableList() 
    ?: mutableListOf(Todo("Write your first TODO statement", false))

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

binding.btnAddTodo.setOnClickListener {
    val title = binding.etTodo.text.toString()
    if (title.isEmpty()) return@setOnClickListener // 空输入过滤避免脏数据
    val todo = Todo(title, false)
    todoList.add(todo)
    // 直接传todoList转ArrayList即可,不要嵌套包装
    tinydb.putListObject("TodoList", ArrayList(todoList))
    adapter.notifyItemInserted(todoList.size - 1)
    // 可选:输入完成后清空输入框
    binding.etTodo.text.clear()
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:18:02