因为在比较的时候需要oldList与新 newList 比较才能得出变化的数据

(2)创建DiffUtil.Callback


在这里面需要声明 判断Item是否已经存在 条件 和   如果Item已经存在则会调用此方法,判断Item的内容是否一致 条件。

(3)得到比较结果重新设置数据



优点:可以自定义比较两个列表中的数据并刷新

缺点:(1)DiffUtil.calculateDiff()这个方法是执行在主线程的,如果新旧数据List比较大,那么这个方法会阻塞主线程可能出现出现ANR
         (2)比较完成后必须调用result.dispatchUpdatesTo(myAdapter)重新设置数据

4. 使用AsyncListDiff

Android 在recycleView 的V27包对原来的数据比对类进行了更新 产生的一个新的数据比对类就是 AsyncListDiff

使用方法:

(1)创建adapter并在adapter中自实现DiffUtil.ItemCallback,给出item差异性计算条件

(2)将所有对数据的操作代理给AsyncListDiffer,可以看到这个Adapter是没有List数据的


(3)使用submitList()更新数据,并刷新ui



对比之前DiffUtil 优点:

(1)不用创来那个两个List比较
(2)将比较放在了子线程中 不再中主线程中比较减少刷新造成的卡顿


下面解析一下 AsyncListDiffer的源码



他其实就是google自己对DiffUtil进行的一次封装
(1)首先在构造方法中创建线程池进行管理
(2)submitList时候先判断数组的内存地址是否相同
(3)判空
(4)开启子线程使用DiffUtil.calculateDiff进行数据比较
(5)回调

github地址:https://github.com/525642022/localRefresh




Android RecycleView局部刷新方式总结-LMLPHP



本文分享自微信公众号 - Android扫地僧(Android-Mas)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

03-09 05:35