RecyclerView实现item局部刷新
相信安卓开发的小伙伴对notifyDataSetChanged这个方法都很熟悉吧,该方法会使容器的所有item进行刷新,近期做了一个应用下载的功能,涉及到显示下载进度,因此这种全局刷新的方法其实就不能使用了,刚好RecyclerView就实现了局部刷新的方法,因此在这里记录一下。一、view的数据绑定方法RecyclerView.Adapter里有这么两个方法public void onBi...
·
相信安卓开发的小伙伴对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);
}
通过两个方法比较会发现有两个细节
- 第二个方法比第一个方法多了payloads参数,该参数是什么意思呢?就是当你局部更新的时候,需要传递更新的数据,那么payloads就存储了你传过来的数据。
- 第二个方法里执行了第一个方法,也就是说在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进行数据绑定即可
}
更多推荐
已为社区贡献1条内容
所有评论(0)