说明
DiffUtil是recycleview-v7包下新增的一个工具类,配合recyclerview使用可以是实现高效地刷新。当然,除了效率之外,还有刷新动画,使整个刷新交互更加流畅。
效果图
diffutil效果
普通刷新效果
如何使用
1,项目里面依赖相应的jar包
compile'com.android.support:design:26.1.0'
2, 在原来的刷新逻辑里将
adapter.notifyDataSetChanged();
替换为
DiffUtil.calculateDiff(new DiffUtilCallBack(newData,oldData), true).dispatchUpdatesTo(adapter);
这边重点说一下DiffUtilCallBack 这个类
public class DiffUtilCallBack extends DiffUtil.Callback {
private List<String> newlist;
private List<String> oldlist;
public DiffUtilCallBack(List<String> newlist, List<String> oldlist) {
this.newlist = newlist;
this.oldlist = oldlist;
}
@Override
public int getOldListSize() {
return oldlist.size();
}
@Override
public int getNewListSize() {
return newlist.size();
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return newlist.get(newItemPosition).equals(oldlist.get(oldItemPosition));//判断是否是同一个item,可以在这里处理 判断是否是相同item的逻辑,比如id之类的
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return newlist.get(newItemPosition).equals(oldlist.get(oldItemPosition));//判断数据是否发生改变,这个 方法会在上面的方法返回true时调用, 因为虽然item是同一个,但有可能item的数据发生了改变
}
}
另外为了考虑扩展性,可以将DiffUtilCallBack 进一步处理
public class DiffUtilCallBack<T extends YourBaseBean> extends DiffUtil.Callback {
private List<T> newlist;
private List<T> oldlist;
public DiffUtilCallBack(List<T> newlist, List<T> oldlist) {
this.newlist = newlist;
this.oldlist = oldlist;
}
@Override
public int getOldListSize() {
return oldlist.size();
}
@Override
public int getNewListSize() {
return newlist.size();
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
//todo 根据YourBaseBean的 条件来判断
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
//todo 根据YourBaseBean的 条件来判断
}
}
注意点
areItemsTheSame
areContentsTheSame
这两个重写方法的判断逻辑要写好,否则,可能会和你预期的刷新效果不一样