使用有效负荷payloads优化RecyclView性能 避免不变部分闪屏

使用有效负荷payloads优化RecyclView性能 避免不变部分闪屏_第1张图片

 

如图示的相册功能,需求是通过实体按键上下左右选择或者点击选择的时候,被选中的item显示蓝色外边框。实现后发现被选中item和取消选中的item有闪屏现象。

 

解决办法,重写onBindViewHolder(ViewHolder holder, int position, List payloads):

@Override
    public void onBindViewHolder(ViewHolder holder, int position, List payloads) {

        if (payloads.isEmpty()) {
            onBindViewHolder(holder, position);
        } else {
            holder.container.setBackgroundColor(position == mCurrentPosition ? ContextCompat.getColor(activity,R.color.color_FF35BAF3) : Color.TRANSPARENT);
        }
    } 
  

该函数的默认实现会调用 onBindViewHolder(holder, position) 这个抽象函数。
这个 payloads 参数是一个 List 对象,该对象不是 null 但可能是 空的。

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

 

另一段代码:

public void setCurrentPosition(int currentPosition) {
        notifyItemChanged(mCurrentPosition, "1111");
        this.mCurrentPosition = currentPosition;
        notifyItemChanged(mCurrentPosition, "1111");
    }


发生更新变动的时候notifyItemChanged加上payload,随便传点什么就行,然后在onBindViewHolder(ViewHolder holder, int position, List payloads)中接收,如果payload不为空,那么就只更新部分UI,不刷新整个RecyclView

 

你可能感兴趣的:(android)