如何在RecyclerView中使用ContentObserver?

时间:2015-04-24 10:09:08

标签: android android-contentprovider android-recyclerview contentobserver

使用ListView,我们有一个很好的本机模式,可以将数据从db映射到列表:

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

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

Using the recyclerview with a database

但使用notifyDataSetChanged旧样式RecyclerView时出现问题。它不能使用ItemAnimator功能,它会失去滚动位置,而且它只是无效。

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

有没有更好的解决方案?

1 个答案:

答案 0 :(得分:0)

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

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

  • areItemsTheSame()知道两个项目是否代表相同的逻辑项目(即使内容不同)。通常,您可以将答案基于项目的识别字段;
  • areContentsTheSame()以确定代表同一逻辑项的两个项目是否具有未修改的内容。

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