如何在RecyclerView中使用ContentObserver?

rud*_*zha 11 android android-contentprovider contentobserver android-recyclerview

随着ListView我们有一个很好的本土模式的一些数据从数据库到列表图:

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

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

将recyclerview与数据库一起使用

但有使用旧式的问题notifyDataSetChangedRecyclerView.它不能使用ItemAnimator功能,它会失去滚动位置,而且它只是无效.

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

有没有更好的解决方案?

XGo*_*het 1

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

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

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

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