【问题标题】:How to use ContentObserver with RecyclerView?如何将 ContentObserver 与 RecyclerView 一起使用?
【发布时间】:2015-04-24 10:09:08
【问题描述】:

使用ListView,我们有一个很好的原生模式来将一些数据从数据库映射到列表:

DB -> ContentProvider -> CursorLoader -> CursorAdapter -> ListView

这种方法在数据层分离、性能和自动数据更新方面都很好。但是这种模式并不适合新的RecyclerView。有一些方法可以模仿旧行为:

Using the recyclerview with a database

但是将旧样式 notifyDataSetChangedRecyclerView 一起使用会出现问题。它不能使用 ItemAnimator 功能,它失去了滚动位置,而且它只是无效的。

那么,在使用 ContentProvider 中包装的 DB 时,我们如何从细化的更改通知中受益? Cursor 是静态的,要从中获取新数据,我们需要获取新的 Cursor。因此,我们似乎需要一个自定义的中间数据层,它将合并来自游标的数据并将实体的List 暴露给RecyclerView.Adapter。此外,我们必须手动将 ContentObserver onChange() 事件映射到 RecyclerView 通知。这也意味着我们将不得不摆脱 CursorLoader。对于这样的基本任务来说,这是一个令人难以置信的工作量。

有没有更好的解决方案?

【问题讨论】:

    标签: android android-contentprovider android-recyclerview contentobserver


    【解决方案1】:

    您可以使用DiffUtils 类来计算新旧游标之间的差异。

    使用时只需要实现两个方法:

    • areItemsTheSame() 知道两个项目是否代表同一个逻辑项目(即使内容不同)。通常你会根据你的项目的识别字段来回答;
    • areContentsTheSame() 了解表示同一逻辑项的两个项是否具有未修改的内容。

    计算出差异后,您只需将其应用到您的适配器,它就会自动调用notifyItemChanged()notifyItemInserted()notifyItemRemoved() accodingly。

    【讨论】:

      猜你喜欢
      • 2015-08-08
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      相关资源
      最近更新 更多