Android RecyclerView MVVM 在哪里使用 notifyDataSetChanged 更新 Adapter

Posted

技术标签:

【中文标题】Android RecyclerView MVVM 在哪里使用 notifyDataSetChanged 更新 Adapter【英文标题】:Android RecyclerView MVVM where to update Adapter with notifyDataSetChanged 【发布时间】:2021-12-22 21:12:04 【问题描述】:

我应该在我的适配器上调用任何形式的notifyDataSetChanged()?数据源是异步填充的,因为我从网络上获取数据。

适配器属于视图。但是适配器的数据源属于视图模型。视图模型不应引用视图。

我能想到的唯一更新我的适配器的方法是使用广播接收器,我不认为这也是推荐的解决方案。

MyFragment.kt

override fun onViewCreated(...) 
    //...
    recyclerView.adapter = myItemAdapter

MyViewModel.kt

private val _myItems = mutableListOf<Item>()
val myItems: List<Item> = _myItems 

private fun someMethod() 
    viewModelScope.launch 
        _myItems.addAll(itemsRepository.getSomeItems())
    

提前致谢

编辑:

我不想将数据源封装在LiveData 中并观察视图中的变化,因为数据源实际上只是初始化了一次,再也不会更新。还有其他方法吗,还是我必须使用LiveData

【问题讨论】:

【参考方案1】:

通过 MutableLiveData 声明 _myItems

val _myItems = MutableLiveData&lt;MutableList&lt;Item1&gt;&gt;()

并在片段中观察它

viewModel._myItems.observe(this, Observer  itemss ->
    myItemAdapter.set(items)
    myItemAdapter.notifyDataSetChanged()

【讨论】:

好吧,我应该说我也想过这个问题。我真的不想让它成为 LiveData 并观察它,因为我觉得这会带来很多开销和混乱,因为数据源实际上只初始化了一次并且再也不会更新。 @SaPropper 如果您不使用 LiveData 或观察,则不需要 MVVM 我将它用于变化的数据(不止一次)......但我想你是对的:观察者是唯一的方法

以上是关于Android RecyclerView MVVM 在哪里使用 notifyDataSetChanged 更新 Adapter的主要内容,如果未能解决你的问题,请参考以下文章

Android RecyclerView MVVM 在哪里使用 notifyDataSetChanged 更新 Adapter

Android入门第64天-MVVM下瀑布流界面的完美实现-使用RecyclerView

recyclerView.addOnScrollListener - “使用 MVVM 改造分页”正在加载相同的响应/列表

MVVM中RecyclerView中的分页重复值

如何在 MVVM 架构中观察 RecyclerView 适配器中的 LiveData?

当notifyDataSetChanged与MVVM一起使用时,RecyclerView不会更新