Android中如何通过适配器将MutableLiveData绑定到RecyclerView
解决方案
报错原因
你遇到的类型不匹配报错核心来自两点:
LiveData的value属性本身是可空类型,在网络请求未完成时,viewModel.toDo.value的初始值为null,无法直接传入要求非空List参数的适配器构造函数- 你没有为
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
相关产品推荐
相关产品推荐

