Android 使用 DiffUtil 处理 RecyclerView 数据更新问题

背景

  1. RecyclerView.Adapter#notifyDataSetChanged() 会每次刷新整个布局;
  2. 每次手动调用 RecyclerView.Adapter#notifyItemXx 系列方法很麻烦;
  3. 需要在新增的项目中跟旧的列表项重复时,只更新内容,而不是插入重复项。

DiffUtil

DiffUtil 就是为了简化 RecyclerVeiw 更新数据操作而生。其关键类和方法如下:

方法描述
DiffUtilpublic static DiffResult calculateDiff(Callback cb)根据 Callback 提供的数据分析出新旧数据列表的差异,返回 DiffResult
DiffUtil.Callbackpublic abstract int getOldListSize()返回旧数据的数量
public abstract int getNewListSize()返回新数据的数量
public abstract boolean areItemsTheSame(int oldItemPosition, int newItemPosition)决定两个数据项是否是同一个
public abstract boolean areContentsTheSame(int oldItemPosition, int newItemPosition)(当两个数据项是同一个时,)决定两个数据项的内容是否同样,或者说是否需要进行更新
DiffUtil.DiffResultpublic void dispatchUpdatesTo(final RecyclerView.Adapter adapter)将差异信息更新到 RecyclerView.Adapter 中

步骤

  1. 创建一个类实现 DiffUtil.Callback
  2. 当新数据到来时,实例化自定义的 callback,传入新旧数据;
  3. 在子线程调用 DiffUtil#calculateDiff 计算差异;
  4. 将差异结果 DiffResult 更新到 RecyclerView.Adapter 中。

更多

  • 使用 android.support.v7.recyclerview.extensions.ListAdapterandroid.support.v7.recyclerview.extensions.AsyncListDiffer

转载于:https://www.cnblogs.com/lshare/p/11333993.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中,DiffUtil 是一个非常有用的工具类,可以帮助我们避免整个 RecyclerView 的刷新,只需要刷新发生变化的部分即可。下面介绍一下如何在低版本的 Android 系统中使用 DiffUtil: 1. 添加依赖库 在项目的 build.gradle 文件中,添加以下依赖库: ``` dependencies { implementation "androidx.recyclerview:recyclerview:版本号" } ``` 2. 创建 DiffUtil.Callback 实现类 创建一个实现 DiffUtil.Callback 接口的类,该接口有四个方法需要实现: - getOldListSize():返回旧数据集合的大小。 - getNewListSize():返回新数据集合的大小。 - areItemsTheSame():判断两个数据是否是同一个对象。 - areContentsTheSame():判断两个数据内容是否相同。 例如: ``` class MyDiffCallback(private val oldList: List<String>, private val newList: List<String>) : DiffUtil.Callback() { override fun getOldListSize(): Int { return oldList.size } override fun getNewListSize(): Int { return newList.size } override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { return oldList[oldItemPosition] == newList[newItemPosition] } override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { return oldList[oldItemPosition] == newList[newItemPosition] } } ``` 3. 调用 DiffUtil.calculateDiff() 方法 在需要更新数据的地方,创建一个 DiffUtil.Callback 实例,并调用 DiffUtil.calculateDiff() 方法,该方法会返回一个 DiffUtil.DiffResult 实例,我们可以在该实例的 dispatchUpdatesTo() 方法中调用 RecyclerView.Adapter.notifyItemRangeChanged() 方法来更新 RecyclerView 中的数据。 例如: ``` val diffCallback = MyDiffCallback(oldList, newList) val diffResult = DiffUtil.calculateDiff(diffCallback) diffResult.dispatchUpdatesTo(adapter) ``` 通过以上步骤,我们就可以在低版本的 Android 系统中使用 DiffUtil 来避免整个 RecyclerView 的刷新,只需要刷新发生变化的部分即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值