Skip to content

DiffUtils是Google官方在support-v7-24.2.0新出的一个工具类,本工程为一个讲解它使用的Demo

Notifications You must be signed in to change notification settings

hanmichael/DiffUtils

This branch is 8 commits behind mcxtzhang/SupportDemos:master.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

49d21b2 · Oct 9, 2016

History

7 Commits
Sep 17, 2016
Sep 17, 2016
Sep 17, 2016
Sep 17, 2016
Oct 9, 2016
Sep 17, 2016
Sep 17, 2016
Sep 17, 2016
Sep 17, 2016
Sep 17, 2016

Repository files navigation

DiffUtil是support-v7:24.2.0中的新工具类,它用来比较两个数据集,寻找出旧数据集-》新数据集的最小变化量。 说到数据集,相信大家知道它是和谁相关的了,就是我的最爱,RecyclerView。 就我使用的这几天来看,它最大的用处就是在RecyclerView刷新时,不再无脑mAdapter.notifyDataSetChanged()。 以前无脑mAdapter.notifyDataSetChanged()有两个缺点:

  1. 不会触发RecyclerView的动画(删除、新增、位移、change动画)
  2. 性能较低,毕竟是无脑的刷新了一遍整个RecyclerView , 极端情况下:新老数据集一模一样,效率是最低的。

使用DiffUtil后,改为如下代码:

DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffCallBack(mDatas, newDatas), true);
diffResult.dispatchUpdatesTo(mAdapter);

它会自动计算新老数据集的差异,并根据差异情况,自动调用以下四个方法

adapter.notifyItemRangeInserted(position, count);
adapter.notifyItemRangeRemoved(position, count);
adapter.notifyItemMoved(fromPosition, toPosition);
adapter.notifyItemRangeChanged(position, count, payload);

显然,这个四个方法在执行时都是伴有RecyclerView的动画的,且都是定向刷新方法,刷新效率蹭蹭的上升了。 老规矩,先上图,

图一是无脑mAdapter.notifyDataSetChanged()的效果图,可以看到刷新交互很生硬,Item突然的出现在某个位置: 这里写图片描述

图二是使用DiffUtils的效果图,最明显的是有插入、移动Item的动画: 这里写图片描述

转成GIF有些渣,下载文末Demo运行效果更佳哦。

##本文将包含且不仅包含以下内容: 1 先介绍DiffUtil的简单用法,实现刷新时的“增量更新”效果。(“增量更新”是我自己的叫法)

2 DiffUtil的高级用法,在某项Item只有内容(data)变化,位置(position)未变化时,完成部分更新(官方称之为Partial bind,部分绑定)。

3 了解到 RecyclerView.Adapter还有public void onBindViewHolder(VH holder, int position, List<Object> payloads) 方法,并掌握它。

4 在子线程中计算DiffResult,在主线程中刷新RecyclerView。

5 少部分人不喜欢的notifyItemChanged()导致Item白光一闪的动画 如何去除。

6 DiffUtil部分类、方法 官方注释的汉化

About

DiffUtils是Google官方在support-v7-24.2.0新出的一个工具类,本工程为一个讲解它使用的Demo

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 100.0%