相信安卓开发的小伙伴对notifyDataSetChanged这个方法都很熟悉吧,该方法会使容器的所有item进行刷新,近期做了一个应用下载的功能,涉及到显示下载进度,因此这种全局刷新的方法其实就不能使用了,刚好RecyclerView就实现了局部刷新的方法,因此在这里记录一下。

一、view的数据绑定方法
RecyclerView.Adapter里有这么两个方法

public void onBindViewHolder(@NonNull ViewHolder holder, int position)
public void onBindViewHolder(@NonNull VH holder, int position, @NonNull List<Object> payloads) {
            this.onBindViewHolder(holder, position);
        }

通过两个方法比较会发现有两个细节

  1. 第二个方法比第一个方法多了payloads参数,该参数是什么意思呢?就是当你局部更新的时候,需要传递更新的数据,那么payloads就存储了你传过来的数据。
  2. 第二个方法里执行了第一个方法,也就是说在adapter绑定视图的时候,是先执行还有payloads参数的这个方法,因此在局部刷新的时候,可以在第二个方法里进行数据处理。

二、如何使用

notifyItemChanged(int position, @Nullable Object payload)

该方法第二个参数就是局部刷新需要的数据了,是一个Object对象,这时候就有人产生疑问了,这边明明是一个Object,那为什么onBindViewHolder方法接收的是一个list集合呢?

如果多次同时调用notifyItemChanged(int position, @Nullable Object payload),它会把多个payload存入到一个list集合中,然后只调用一次onBindViewHolder。

@Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, int position, @NonNull List<Object> payloads) {
        if (payloads.isEmpty()) {
            //如果payloads没数据,说明不是局部刷新,下面这句是关键,通过源码看 会执行不带payloads参数的onBindViewHolder
            super.onBindViewHolder(holder, position, payloads);
            return;
        } else {
        //从payloads取出数据,对holder进行数据绑定就可以了
        }
    }
@Override
    public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int position) {
//上面的方法调用super.onBindViewHolder(holder, position, payloads);就会执行改方法,在此方法中通过position获取数据然后对viewHolder进行数据绑定即可
	}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐