如何使用ContentObserver和RecyclerView?

有了ListView我们已经有了一个很好的本地模式来将一些数据从数据库映射到列表:

DB – > ContentProvider – > CursorLoader – > CursorAdapter – > ListView

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

与数据库一起使用recyclerview

但是使用旧式的notifyDataSetChangedRecyclerView有一个问题。 它不能使用ItemAnimatorfunction,它失去了滚动的位置,它只是无效的。

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

有没有更好的解决scheme?

Solutions Collecting From Web of "如何使用ContentObserver和RecyclerView?"

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

使用它时,你只需要实现两种方法:

  • areItemsTheSame()知道两个项目是否表示相同的逻辑项目(即使内容不同)。 通常你会把答案放在你物品的识别字段上;
  • areContentsTheSame()知道表示同一逻辑项目的两个项目是否具有未修改的内容。

一旦计算出差异,就可以将其应用到适配器,并自动调用notifyItemChanged()notifyItemInserted()notifyItemRemoved()