首页 理论教育 Android 7.0新特性:DiffUtil工具类详解

Android 7.0新特性:DiffUtil工具类详解

时间:2023-06-27 理论教育 版权反馈
【摘要】:DiffUtil是support-v7:24.2.0中的新工具类,用来比较两个数据集,寻找出旧数据集与新数据集的最小变化量。使用DiffUtil后,改为如下代码。我们需要实现一个继承自DiffUtil.Callback的类,实现它的四个Abstract方法。在Android 2.3中创建应用项目:DiffUtils,项目的构成如图5-20所示。图5-21 项目的布局文件java文件有以下四个:MainAcvity.java——主Activity处理类;TestBean.java——Re-cyclerView显示的数据;DiffAdapter.java——RecyclerView的适配器类;DiffCallBack.java——DiffUtil.Callback的实现。TestBean.java、MainAcvity.java、DiffAdapter和前面介绍的Recy-clerView相类似,这里主要介绍DiffCallBack.java,其代码如下。图5-22 DiffUtils项目的运行结果

Android 7.0新特性:DiffUtil工具类详解

DiffUtil是support-v7:24.2.0中的新工具类,用来比较两个数据集,寻找出旧数据集与新数据集的最小变化量。说到数据集,相信大家已经知道它与RecyclerView相关。

RecyclerView刷新时,调用RecyclerView的Adapter类的方法notifyDataSetChanged(),notifyDataSetChanged()有两个缺点:(1)不会触发RecyclerView的动画(删除、新增、位移、change动画);(2)性能较低,刷新了一遍整个RecyclerView,在极端情况下,新老数据集一模一样,效率是最低的。

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

978-7-111-58810-8-Chapter05-114.jpg

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

978-7-111-58810-8-Chapter05-115.jpg

显然,这个四个方法在执行时都伴有RecyclerView动画,且都是定向刷新方法,刷新效率大幅上升。

我们需要实现一个继承自DiffUtil.Callback的类,实现它的四个Abstract方法。虽然这个类叫Callback,但是可以把它理解成定义了一些用来比较新老Item是否相等的契约(Con-tract)、规则(Rule)的类。

DiffUtil.Callback抽象类如下。

978-7-111-58810-8-Chapter05-116.jpg

978-7-111-58810-8-Chapter05-117.jpg

下面以一个实例进行说明。

(1)在Android 2.3中创建应用项目:DiffUtils,项目的构成如图5-20所示。(www.xing528.com)

978-7-111-58810-8-Chapter05-118.jpg

图5-20 项目构成

(2)其中有两个布局文件:一个是主布局文件activity_main.xml,其中包含Recycler-View和按钮控件;另一个是RecyclerView显示项的布局文件item_diff.xml,如图5-21所示。

978-7-111-58810-8-Chapter05-119.jpg

图5-21 项目的布局文件

(3)java文件有以下四个:MainAcvity.java——主Activity处理类;TestBean.java——Re-cyclerView显示的数据;DiffAdapter.java——RecyclerView的适配器类;DiffCallBack.java——DiffUtil.Callback的实现。TestBean.java、MainAcvity.java、DiffAdapter和前面介绍的Recy-clerView相类似,这里主要介绍DiffCallBack.java,其代码如下。

978-7-111-58810-8-Chapter05-120.jpg

978-7-111-58810-8-Chapter05-121.jpg

(4)DiffUtils项目的运行结果如图5-22所示。

978-7-111-58810-8-Chapter05-122.jpg

图5-22 DiffUtils项目的运行结果

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈