說(shuō)明
DiffUtil是recycleview-v7包下新增的一個(gè)工具類,配合recyclerview使用可以是實(shí)現(xiàn)高效地刷新。當(dāng)然,除了效率之外,還有刷新動(dòng)畫,使整個(gè)刷新交互更加流暢。
效果圖

diffutil效果

普通刷新效果
如何使用
1,項(xiàng)目里面依賴相應(yīng)的jar包
compile'com.android.support:design:26.1.0'
2, 在原來(lái)的刷新邏輯里將
adapter.notifyDataSetChanged();
替換為
DiffUtil.calculateDiff(new DiffUtilCallBack(newData,oldData), true).dispatchUpdatesTo(adapter);
這邊重點(diǎn)說(shuō)一下DiffUtilCallBack 這個(gè)類
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));//判斷是否是同一個(gè)item,可以在這里處理 判斷是否是相同item的邏輯,比如id之類的
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return newlist.get(newItemPosition).equals(oldlist.get(oldItemPosition));//判斷數(shù)據(jù)是否發(fā)生改變,這個(gè) 方法會(huì)在上面的方法返回true時(shí)調(diào)用, 因?yàn)殡m然item是同一個(gè),但有可能item的數(shù)據(jù)發(fā)生了改變
}
}
另外為了考慮擴(kuò)展性,可以將DiffUtilCallBack 進(jìn)一步處理
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 根據(jù)YourBaseBean的 條件來(lái)判斷
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
//todo 根據(jù)YourBaseBean的 條件來(lái)判斷
}
}
注意點(diǎn)
areItemsTheSame
areContentsTheSame
這兩個(gè)重寫方法的判斷邏輯要寫好,否則,可能會(huì)和你預(yù)期的刷新效果不一樣