微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – 如何用RecyclerView使用ContentObserver?

使用ListView,我们已经有了一个很好的本机模式来将一些数据从db映射到列表:

DB – > ContentProvider – > CursorLoader – > CursorAdapter – >列表显示

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

Using the recyclerview with a database

但是使用RecyclerView的旧样式notifyDataSetChanged有问题.它不能使用ItemAnimator功能,它失去滚动位置,它只是无效.

那么,当使用ContentProvider中包含的数据包时,我们如何可以从细微的更改通知中受益?光标是静态的,要从中获取新的数据,我们需要获得新的光标.所以,似乎我们需要一个自定义的中间数据层,它将从Cursors中合并数据,并将实体列表暴露给RecyclerView.Adapter.另外,我们将手动将ContentChange()事件映射到RecyclerView通知.这也意味着我们必须摆脱CursorLoader.对于这样的基本任务来说,这是一个令人难以置信的工作量.

有没有更好的解决方案?

解决方法

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

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

> areItemsTheSame()知道两个项目是否代表相同的逻辑项目(即使内容不同).通常你会根据你的项目的识别字段的答案;
> areContentsTheSame()知道两个表示相同逻辑项目的项目是否具有未修改内容.

一旦计算差异,您可以将其应用于您的适配器,并自动调用notifyItemChanged(),notifyItemInserted()或notifyItemRemoved().

原文地址:https://www.jb51.cc/android/312921.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐