【问题标题】:Android RecyclerView MVVM where to update Adapter with notifyDataSetChangedAndroid RecyclerView MVVM 在哪里使用 notifyDataSetChanged 更新 Adapter
【发布时间】: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?

【问题讨论】:

    标签: android mvvm android-recyclerview android-adapter notifydatasetchanged


    【解决方案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
    • 我将它用于变化的数据(不止一次)......但我想你是对的:观察者是唯一的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多