首页 存档 技术 查看内容

Android 开发 Diffutils 打造不一样的Recyclerview

2018-3-30 13:00 |来自: 互联网 384 0

摘要: 简述 DiffUtil是recyclerview support library v7 24.2.0版本中新增的类,根据Google官方文档的介绍,DiffUtil的作用是比较两个数据列表并能计算出一系列将旧数据表转换成新数据表的操作。这个概念比较抽象,换一种 ...

简述

DiffUtil是recyclerview support library v7 24.2.0版本中新增的类,根据Google官方文档的介绍,DiffUtil的作用是比较两个数据列表并能计算出一系列将旧数据表转换成新数据表的操作。这个概念比较抽象,换一种方式理解,DiffUtil是一个工具类,当你的RecyclerView需要更新数据时,将新旧数据集传给它,它就能快速告知adapter有哪些数据需要更新。就相当于如果改变了就对某个item刷新,没改变就没刷新,可以简称为局部刷新。

无脑刷新VS局部刷新

首先我们需要知道DiffUtil使用Eugene W. Myers的Difference算法来计算出将一个数据集转换为另一个的最小更新量,也就是用最简单的方式将一个数据集转换为另一个。DiffUtil还可以识别一项数据在数据集中的移动。但该算法不能检测移动的item,所以Google在其基础上改进支持检测移动项目,但是检测移动项目,会更耗性能。 下面是谷歌官网给出的在Nexus 5X M系统上进行运算的时长:

  • 100项数据,10处改动:平均值0.39ms,中位数:0.35ms。
    100项数据,100处改动:

  • 打开了移位识别时:平均值:3.82ms,中位数:3.75ms。
    关闭了移位识别时:平均值:2.09ms,中位数:2.06ms。
    1000项数据,50处改动:

    • 打开了移位识别时:平均值:4.67ms,中位数:4.59ms。

    • 关闭了移位识别时:平均值:3.59ms,中位数:3.50ms。

  • 1000项数据,200处改动:

    • 打开了移位识别时:平均值:27.07ms,中位数:26.92ms。

    • 关闭了移位识别时:平均值:13.54ms,中位数:13.36ms。

使用姿势

首先,我们得学会如何使用它,第二,我们需要知道用什么姿势来使用它,姿势不对,全都白费。

Diffutils.Callback

我们先看下Diffutils的callback的源码:

 /**
   * A Callback class used by DiffUtil while calculating the diff between two lists.
   * 当使用Diffutils的时候,这是一个计算2个list不同的回调函数
   */
  public abstract static class Callback {
/** * Returns the size of the old list. * 得到老的数据源大小 */ public abstract int getOldListSize();
/** * Returns the size of the new list. * 得到新的数据源大小 */ public abstract int getNewListSize();
/** * Called by the DiffUtil to decide whether two object represent the same Item. * For example, if your items have unique ids, this method should check their id equality. *
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部