在5.0以后大家在使用列表控件时已经逐渐的使用recycleView来代替ListView了,但是很多人并不了解recycleView的高效率的刷新方式
首先我们先介绍一下recycleView自带的刷新方式:
1.使用 Adapter.notifyDataSetChanged();
优点:简单 粗暴 直接刷新所有的Item布局
缺点:(1)刷新的太多了 影响效率 ,如果遇到复杂的逻辑容易卡顿
(2)刷新的时候无法触发 recycleView 的动画
2.自带的局部刷新
Adapter.notifyItemChanged(int)
Adapter.notifyItemInserted(int)
Adapter.notifyItemRangeChanged(int,int)
Adapter.notifyItemRangeInserted(int,int)
Adapter.notifyItemRangeRemoved(int,int)
优点:不用刷新整个列表可以局部刷新 提高效率
缺点: 每次刷新都要知道position 如果刷新单条比较好使 担当刷新条目比较多的时候需要单独计算每个条目的position不是很方便
3.使用DiffUtil android recycleView-24以后自带的比对数据的类
使用方法:
(1)正常创建adapter 注意设置数据是新建一个List 去接受数据
public void setData(List<TextModel> data) {
this.data = new ArrayList<>(data);
}
因为在比较的时候需要oldList与新 newList 比较才能得出变化的数据
(2)创建DiffUtil.Callback
public class MyCallback extends DiffUtil.Callback {
private List<TextModel> old_students, new_students;
public MyCallback(List<TextModel> data, List<TextModel> students) {
this.old_students = data;
this.new_students = students;
}
@Override
public int getOldListSize() {
return old_students.size();
}
@Override
public int getNewListSize() {
return new_students.size();
}
// 判断Item是否已经存在
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return old_students.get(oldItemPosition).getTextTitle() == new_students.get(newItemPosition).getTextTitle();
}
// 如果Item已经存在则会调用此方法,判断Item的内容是否一致
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return old_students.get(oldItemPosition).getTextContent().equals(new_students.get(newItemPosition).getTextContent());
}
}
在这里面需要声明 判断Item是否已经存在 条件 和 如果Item已经存在则会调用此方法,判断Item的内容是否一致 条件。
(3)得到比较结果重新设置数据
DiffUtil.DiffResult result = DiffUtil.calculateDiff(new MyCallback(oldList, mTextModels), true);
myAdapter.setData(mTextModels);
result.dispatchUpdatesTo(myAd