目录
- RecyclerView之概述
- RecyclerView之绘制流程
- RecyclerView之Adapter
- RecyclerView之ItemDecoration
- RecyclerView之ItemAnimator
- RecyclerView之DiffUtil
- RecyclerView之缓存策略
概述
使用DiffUtil的原因是替代notifyDataSetChanged,提升性能。
DiffUtil使用的是Eugene Myers的差别算法,这个算法本身不能检查到元素的移动,也就是移动只能被算作先删除、再增加,而DiffUtil是在算法的结果后再
进行一次移动检查。假设在不检测元素移动的情况下,算法的时间复杂度为O(N + D2),而检测元素移动则复杂度为O(N2)。所以,如果集合本身就已经排好序,
可以不进行移动的检测提升效率。
ListAdapter和AsyncListDiffer中有使用。
使用
1 |
|
使用的步骤:
- 实现DiffUtil.Callback
- 调用calculateDiff计算不同点
- dispatchUpdatesTo刷新数据
源码分析
1 |
|
过程如下:
- 实现DiffUtil.Callback接口
- 新老数据集通过DiffUtil.calculateDiff计算得到DiffUtil.DiffResult
- DiffUtil.DiffResult::dispatchUpdatesTo刷新数据