【问题标题】:Call notifiyDataSetChanged() from android viewmodel从 android viewmodel 调用 notifyDataSetChanged()
【发布时间】:2020-06-12 17:12:40
【问题描述】:

我正在使用 Android MVVM 制作一个包含大量数据的反应式应用。在很多情况下,我将数据推送到我的应用程序中的 firestore 文档,但我也希望数据的这种更改能够在我的应用程序中本地反映。所以我也将数据添加到firestore文档的本地副本(数据类)中。我在我的视图模型中执行此操作。

这里的问题是在我重新启动应用程序之前我不会看到变化。所以我需要一种从我的视图模型中调用adapter.notifyDataSetChanged() 的方法,以便立即更新回收站视图。最好的方法是什么?请帮忙。

【问题讨论】:

  • 如果您使用 MVVM,视图模型应该提供订阅数据更改的方法,以便适配器可以订阅并在发生更改时调用自己的notifyDataSetChanged。由于您将本地副本存储在视图模型中,因此您可以将其包装在 LiveData 中,并让相关的 Fragment observe 做出反应。

标签: android kotlin mvvm android-recyclerview


【解决方案1】:

当您频繁更改和更新数据时,adapter.notifyDataSetChanged 在这种情况下没有帮助,因为即使您更新了一项,它也会更新整个列表,即使其余的没有被触及!

所以一个更好的方法来制作你的适配器

1-extend ListAdapter<data_model, view_holder>(diff_callback)。 这在后台使用 AsyncListDiffer 仅计算和更新更改的项目

2-当您需要在 viewmodel 调用中更新数据时:

adapter.submitList()

有关如何执行此操作的更多信息: 检查文档:https://developer.android.com/reference/androidx/recyclerview/widget/ListAdapter

【讨论】:

    【解决方案2】:

    您的 ViewModel 不应直接调用 adapter.notifyDataSetChanged(),原因有两个:

    1. 适配器是 Android 依赖项。如果你想write unit tests to yours view model 你应该避免使用 android 框架依赖项
    2. 我认为adapter.notifyDataSetChanged() 是UI 逻辑实现细节。如果我们将这个逻辑移到我们的视图层会更好 (fragment/activity/custom views)

    您可以通过在您的适配器中封装notifyDataSetChanged 逻辑来解决此问题,如下所示:

    // Observe live data changes and set it to yours adapter
    viewModel.state().observe(this, Observer {
          newData: List<....> ->
          adapter.setData(newData)
    })
    
    // Encapsulate notifyDataSetChanged at yours adapter:
    class YoursAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    
        fun setData(data: List<.....>) {
            ......
            notifyDataSetChanged()
        }
    }
    

    在这种情况下,很容易将适配器实现从 notifyDataSetChanged() 更改为更精确的更新,例如稍后的 notifyItemInserted()

    但我也建议不要使用 notifyDataSetChanged() 函数,而更喜欢DiffUtil。或者使用可以帮助回收者查看样板的库,并且已经在后台提供了 DiffUtil 支持。例如我喜欢在我的项目中使用Groupie

    【讨论】:

      猜你喜欢
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      相关资源
      最近更新 更多