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

Android中如何通过适配器将MutableLiveData绑定到RecyclerView

解决方案

报错原因

你遇到的类型不匹配报错核心来自两点:

  1. LiveData的value属性本身是可空类型,在网络请求未完成时,viewModel.toDo.value的初始值为null,无法直接传入要求非空List参数的适配器构造函数
  2. 你没有为LiveData注册观察者,就算后续网络请求返回了数据,适配器也无法收到更新通知,列表不会自动刷新

第一步:改造TodoAdapter支持动态更新数据

你的现有适配器把列表数据写死为构造函数传入的固定值,无法后续更新,需要调整为支持动态修改数据集:

// 构造函数默认传入空列表,避免空值问题
class TodoAdapter(private val context: Context, private var Items: List<ToDo> = emptyList()) : RecyclerView.Adapter<TodoAdapter.TodoViewHolder>{
    class TodoViewHolder(private val view: View) : RecyclerView.ViewHolder(view){
        val textView: TextView = view.findViewById(R.id.text_view_name)
    }

    override fun getItemCount() = Items.size

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TodoViewHolder {
        val adapterLayout = LayoutInflater.from(parent.context).inflate(R.layout.todo_item, parent, false)
        return TodoViewHolder(adapterLayout)
    }

    override fun onBindViewHolder(holder: TodoViewHolder, position: Int) {
        val todo = Items[position]
        // 修复原代码错误:不要用resources.getString读取数值,直接转字符串即可
        holder.textView.text = todo.Id.toString()
    }

    // 新增更新数据的方法
    fun updateData(newList: List<ToDo>) {
        Items = newList
        notifyDataSetChanged()
        // 后续优化可以用DiffUtil代替notifyDataSetChanged,减少不必要的刷新
    }
}

第二步:在MainActivity中观察LiveData更新列表

初始化适配器时先传入空列表,再注册LiveData的观察者,当接口返回数据后自动更新适配器:

class MainActivity : AppCompatActivity() {
    private val viewModel = MainActivityViewModel()
    private lateinit var binding: ActivityMainBinding
    private lateinit var linearLayoutManager: LinearLayoutManager
    // 适配器改成全局变量方便后续更新数据
    private lateinit var todoAdapter: TodoAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        linearLayoutManager = LinearLayoutManager(this)
        // 初始化适配器时传入空列表
        todoAdapter = TodoAdapter(this)
        binding.recyclerView.layoutManager = linearLayoutManager
        binding.recyclerView.adapter = todoAdapter

        // 观察LiveData,数据变化时更新适配器
        viewModel.toDo.observe(this) { newTodoList ->
            newTodoList?.let {
                todoAdapter.updateData(it)
            }
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:09:00