使用 Payload 提高 RecyclerView 渲染效率

RecyclerView.Adapter 中有个带有 payloads 参数的函数,由于这个函数不是抽象函数,被很多人忽略了。该函数定义如下:

public void onBindViewHolder(VHholder, int position, List<Object> payloads) {
            onBindViewHolder(holder, position);
        }
 

该函数的默认实现会调用 onBindViewHolder(holder, position) 这个抽象函数。

这个 payloads 参数是一个 List 对象,该对象不是 null 但可能是 空的。通过 Adapter 的 notifyXXX 函数的带有 payload 参数的函数可以设置 payload 对象,例如通知一个条目数据变化的函数:

        public final void notifyItemChanged(int position, Object payload) {
            mObservable.notifyItemRangeChanged(position, 1, payload);
        }
 

下面来看看这个 payload 是干什么的。

如果没有 payload , 当调用 notifyItemChanged 的时候, RecyclerView 会通过回调 onBindViewHolder(holder, position) 来更新当前数据变化的 View,但是对于比较复杂的条目,里面有很多个不同的控件,比如有图片、文字、CheckBox 等,用户点击一下当前条目(比如 喜欢一个微博信息),需要把喜欢的状态高亮。 也就是说,当前一个微博条目中只有一个喜欢状态的变化,但是需要重新在 onBindViewHolder(holder, position) 中设置所有View 的内容。对于每个 View ,当设置其内容的时候,都会触发 View 的重新布局和计算位置,这样至少一个 View 状态变化了 最终导致整个条目都需要重新布局一遍。

如果通过 payload 来告诉系统这个微博消息只有喜欢状态变化了,这样在调用 onBindViewHolder(VH holder, int position, List

需要注意的是,当 payloads 为 空的时候,说明是该条目的整个数据都变化了, 需要更新所有的数据,所以你可以在当 payloads 为 空 的时候调用不带 payloads 参数的函数,如下:

    @Override
    public void onBindViewHolder(ViewHolderholder, int position, List<Object> payloads) {
        if (payloads.isEmpty()) {
            // payloads 为 空,说明是更新整个 ViewHolder
            onBindViewHolder(holder, position);
        } else {
            // payloads 不为空,这只更新需要更新的 View 即可。
            holder.mBadgeView.setVisibility(((Item)payloads.get(0)).disabled ? View.VISIBLE : View.INVISIBLE);
        }
    }
原文来自
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值