RecyclerView数据更新神器 进化版- AsyncListDiffer

概述

RecyclerView数据更新神器 - DiffUtil 译文中,已经了解到DiffUtil如何神助RecyclerView进行UI更新。它有一个缺陷就是DiffUtil在计算新旧数据集差异时需要开启线程,而在更新UI时又要在主线程。尽管可以这么做:

  • Thread + Handler
  • RxJava

虽然这样可以实现,但又显得笨拙。在support-v7:27.1.0又新增了一个DiffUtil的封装类 - AsyncListDiffer,它在后台线程使用DiffUtil计算旧数据集->新数据集的最小量,同时又在主线程中将更新操作的最小量分发给ListUpdateCallback,以完成数据更新,从而弥补了DiffUtil的缺陷。

核心类

DiffUtil.ItemCallback

与DIffUtil.Callback方法类似,DiffUtil在计算旧数据集->新数据集时,回调它。在DiffUtil.Callback中,提供两种处理角色 ->Item的列表索引和Item差异。而,在DiffUtil.ItemCallback中只处理Item差异。它允许从UI和内容特定的差异代码中分离索引到数组或者List中。

/**
 * DiffUtil在计算两个列表之间的非空Item的差异时使用的回调类。
 * DiffUtil.Callback提供两种处理角色 - 列表索引和item差异。而,DiffUtil.ItemCallback只处理第二个,它允许从UI和内容特定的差异代码中分离索引到数组或者List中。
 */
public abstract static class ItemCallback<T> {
    /**
     * 用来判断 两个对象是否是相同的Item
     * 例如,如果你的Item有唯一的id字段,这个方法就 判断id是否相等。
     */
    public abstract boolean areItemsTheSame(T oldItem, T newItem);

    /**
     * 当它想要检查两个Item是否具有相同的数据时由DiffUtil调用。
     * DiffUtil使用返回的信息来判断内容是否已更改
     * DiffUtil 用这个方法替代equals方法去检查是否相等,以便根据UI更改其行为
     * 例如,如果你用RecyclerView.Adapter配合DiffUtil使用,需要返回Item的视觉表现是否相同。
     * 这个方法仅仅在areItemsTheSame()返回true时,才调用。
     * 
     * 返回true,表示新旧数据集中,当前位置的item内容相同,否则,不同
     */
    public abstract boolean areContentsTheSame(T oldItem, T newItem);

    /**
     * 当areItemsTheSame(int, int)返回true并且areContentsTheSame(int, int)返回false时,DiffUtil才会调用此方法,以获取该item改变的payload
     * 例如,如果你用RecyclerView配合DiffUtils,你可以返回  这个Item改变的那些字段,RecyclerView.ItemAnimator可以使用哪些信息执行动画
     * 默认的实现是返回null
     *  返回 一个 代表着新老item的改变内容的 payload对象
     */
    @SuppressWarnings({"WeakerAccess", "unused"})
    public Object getChangePayload(T oldItem, T newItem) {
        return null;
    }
}

AsyncDifferConfig

AsyncDifferConfig是ListAdapter,AsyncListDiffer和后台线程的配置对象。在其内,至少定义一个DiffUtil.ItemCallback,用于DiffUtil在计算旧数据集->新数据集时回调。

AsyncDifferConfig.Builder

AsyncDifferConfig.Builder是AsyncDifferConfig构建类,主要是用来配置Diff计算数据集差异时的后台线程和DiffUtil.ItemCallback回调。

  • AsyncDifferConfig.Builder (DiffUtil.ItemCallback diffCallback)

在创建AsyncDifferConfig.Builder是必须传递一个DiffUtil.ItemCallback对象,用于DiffUtil计算数据集差异时回调。

当AsyncDifferConfig.Builde调用build()创建AsyncDifferConfig对象时,如果未设置指定的后台线程ÿ

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值