首先正常的DiffUtil使用如下:
还没用过改工具的可以看下这位大神的博客:
http://blog.csdn.net/zxt0601/article/details/52562770
DiffUtil.DiffResult diffResult= DiffUtil.calculateDiff(new MyDiff(mNewDatas,mOldDatas),true);
diffResult.dispatchUpdatesTo(adapter);
我们可以将DiffUtil.CallBack封装一下
public class MyDiff<T extends BaseData> extends DiffUtil.Callback {
private List<T> mNewDatas,mOldDatas;
public MyDiff(List<T> mNewDatas, List<T> mOldDatas) {
this.mNewDatas = mNewDatas;
this.mOldDatas = mOldDatas;
}
@Override
public int getOldListSize() {
return mOldDatas!=null?mOldDatas.size():0;
}
@Override
public int getNewListSize() {
return mNewDatas!=null?mNewDatas.size():0;
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return mOldDatas.get(oldItemPosition).getBaseId().equals
(mNewDatas.get(newItemPosition).getBaseId());
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
BaseData oldBaseData=mOldDatas.get(oldItemPosition);
BaseData newBaseData=mNewDatas.get(newItemPosition);
if (oldBaseData.getBaseName().equals(newBaseData.getBaseName())){
return false;
}
return true;
}
}
这里List的数据继承BaseData,用于areItemsTheSame方法和areContentsTheSame方法的判断
BaseData如下:
public class BaseData {
String baseId;//用于areItemsTheSame方法的判断
String baseName;//用于areContentsTheSame方法的判断
public String getBaseId() {
return baseId;
}
public void setBaseId(String baseId) {
this.baseId = baseId;
}
public String getBaseName() {
return baseName;
}
public void setBaseName(String baseName) {
this.baseName = baseName;
}
}
接下来我们在adapter里使用DiffUtil
public class MyAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<T> mDatas;
public MyAdapter(List<T> mDatas) {
this.mDatas = mDatas;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
public void upDate(List<T> newDatas){
if (newDatas==null) {
return;
}
DiffUtil.DiffResult diffResult= DiffUtil.calculateDiff(new MyDiff(newDatas,mDatas),true);
diffResult.dispatchUpdatesTo(this);
this.mDatas=newDatas;//别忘了更新数据
}
}
这里主要是让大家明白adapter里使用DiffUtil,请看upDate方法和构造方法.
先看下实体类的使用
public class TestData extends BaseData {
String id;
String name;
String sex;
String year;
public String getId() {
return id;
}
/**
* 用于DiffUtil.CallBack的数据判断
* areItemsTheSame方法
* @param id
*/
public void setId(String id) {
this.id = id;
setBaseId(id);//BaseData里的方法
}
public String getName() {
return name;
}
/**
* 用于DiffUtil.CallBack的二次判断
* areContentsTheSame方法
* @param name
*/
public void setName(String name) {
this.name = name;
setBaseName(name);//BaseData里的方法
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
}
继承BaseData,这里我先根据id和name去做判断,在实际使用中,大家根据数据的不同性去选择两个或者更多的变量去做判断.
关于基类BaseData,我这里是写两个变量做判断,根据需求大家可以定义N个变量,实体类也要一一对应
我们开始在Actvity里更新数据
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private List<TestData> mNewDatas,mOldDatas;
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init(){
mNewDatas=new ArrayList<>();
for (int i=0;i<5;i++){
TestData td=new TestData();
td.setId(""+i);
td.setName("陈"+i);
mNewDatas.add(td);
}
recyclerView= (RecyclerView) findViewById(R.id.mRecyclerView);
recyclerView.setAdapter(new MyAdapter(mNewDatas));
}
/**
* 默认
*/
private void actviityUpDate(){
mOldDatas=new ArrayList<>();
for (int i=5;i<10;i++){
TestData td=new TestData();
td.setId(""+i);
td.setName("王"+i);
mOldDatas.add(td);
}
adapter.upDate(mOldDatas);
}
}
执行actviityUpDate方法便可以更新数据.
这篇博客主要是讲思路,Demo没有完整的写出来
,有必要的话会给出完整Demo.
到这里结束,有写得不好的地方请大家多多指教.
谢谢.