您的位置:首页 > 其它

[置顶] 为你的RecyclerView.Adapter添加通用DiffUtil适配器

2017-04-03 12:24 309 查看
首先正常的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.

到这里结束,有写得不好的地方请大家多多指教.

谢谢.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: