//RecyclerView配合DiffUtil使用非常方便,但是DiffUtil.Callback需要重新很多無用代碼,今天就封裝下這個類,讓使用者,使用更加happy。
//核心代碼
public abstract class BaseDiffUtilCallback<T> extends DiffUtil.Callback {
protected List<T> oldList;
protected List<T> newList;
public BaseDiffUtilCallback(List<T> oldList, List<T> newList) {
this.oldList = oldList;
this.newList = newList;
}
@Override
public int getOldListSize() {
if (oldList != null) {
return oldList.size();
}
return 0;
}
@Override
public int getNewListSize() {
if (newList != null) {
return newList.size();
}
return 0;
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return setAreItemsTheSame(oldItemPosition,newItemPosition);
}
/**
* 判斷item佈局是否相同
* 子類實現
* @param oldItemPosition
* @param newItemPosition
* @return
*/
public abstract boolean setAreItemsTheSame(int oldItemPosition, int newItemPosition);
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return setAreContentsTheSame(oldItemPosition, newItemPosition);
}
/**
* 判斷item內容是否相同
* 子類實現
* @param oldItemPosition
* @param newItemPosition
* @return
*/
public abstract boolean setAreContentsTheSame(int oldItemPosition, int newItemPosition);
}
//使用
public class RecyclerItemCallback extends BaseDiffUtilCallback<Bean> {
public RecyclerItemCallback(List<Bean> oldList, List<Bean> newList) {
super(oldList, newList);
}
@Override
public boolean setAreItemsTheSame(int oldItemPosition, int newItemPosition) {
return Objects.equals(newList.get(newItemPosition).getId(), oldList.get(oldItemPosition).getId());
}
@Override
public boolean setAreContentsTheSame(int oldItemPosition, int newItemPosition) {
return Objects.equals(oldList.get(oldItemPosition).getContent(), newList.get(newItemPosition).getContent());
}
}
//封裝後的callback是不是很簡潔了。