页面局部刷新实现以及DiffUtil源码剖析

  1. 前言
    本文主要分成四部分。
    1. 页面局部刷新实现
    2. 局部刷新代码结构分析
    3. Myers差分算法分析
    4. DiffUtil源码分析

页面局部刷新实现

最近接到一个需求,就是在我的应用页面,当监听到应用安装或者卸载时,不要重新刷新页面,只要更新图标,更新焦点即可。

因为在电视上开发应用,所以全部使用leanbak方式开发。

实现方式:updateDiff()方法中使用leanback的ArrayObjectAdapter的void setItems(final List itemList, final DiffCallback callback)方法局部刷新界面。

实现方法

/**
 * 通过DiffCallback实现局部视图刷新
 */
protected void updateDiff(Block<DisplayItem> newAppData) {
    try {
        if (newAppData == null || newAppData.items == null) {
            return;
        }
        ViewHolder rowVh = mHolder;
        if (newAppData.items.size() > 0) {
            ArrayObjectAdapter mArrayObjectAdapter = rowVh.mAdapter;
            if (mArrayObjectAdapter != null) {
                mArrayObjectAdapter.setItems(newAppData.items, new DiffCallback() {
                    @Override
                    public boolean areItemsTheSame(@NonNull Object oldData, @NonNull Object newData) {
                        ...
                    }

                    @Override
                    public boolean areContentsTheSame(@NonNull Object oldData, @NonNull Object newData) {
                        ...
                    }

                    @Override
                    public Object getChangePayload(@NonNull Object oldData, @NonNull Object newData){
                        ...
                    }
                });
                
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

DiffCallback类三个接口如下。如何使用?
先说结论
areItemsTheSame:判断item占位是否相同,一般根据item.id去判断。但内容可以不同(参考viewhold复用)
areContentsTheSame:areItemsTheSame返回True时,才会调用,返回内容是否相同。
getChangePayload:areItemsTheSame返回True,areContentsTheSame返回False才会回调,即item相同,content不同时才会回调,表示内容的差异,返回差异的数据diffData。没有差异返回super即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值