[置顶] 为你的RecyclerView.Adapter添加通用DiffUtil适配器
2017-04-03 12:24
309 查看
首先正常的DiffUtil使用如下:
还没用过改工具的可以看下这位大神的博客:
http://blog.csdn.net/zxt0601/article/details/52562770
我们可以将DiffUtil.CallBack封装一下
这里List的数据继承BaseData,用于areItemsTheSame方法和areContentsTheSame方法的判断
BaseData如下:
接下来我们在adapter里使用DiffUtil
这里主要是让大家明白adapter里使用DiffUtil,请看upDate方法和构造方法.
先看下实体类的使用
继承BaseData,这里我先根据id和name去做判断,在实际使用中,大家根据数据的不同性去选择两个或者更多的变量去做判断.
关于基类BaseData,我这里是写两个变量做判断,根据需求大家可以定义N个变量,实体类也要一一对应
我们开始在Actvity里更新数据
执行actviityUpDate方法便可以更新数据.
这篇博客主要是讲思路,Demo没有完整的写出来
,有必要的话会给出完整Demo.
到这里结束,有写得不好的地方请大家多多指教.
谢谢.
还没用过改工具的可以看下这位大神的博客:
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.
到这里结束,有写得不好的地方请大家多多指教.
谢谢.
相关文章推荐
- [置顶] 提炼RecyclerView、ListView的通用适配器,大幅减少项目中adapter的代码量
- [置顶] 一个适用于ListView/GridView/RecyclerView的通用适配器
- 为RecyclerView打造通用Adapter 让RecyclerView更加好用
- 为RecyclerView打造通用Adapter 让RecyclerView更加好用
- 简化 RecyclerView 的多种 type 的 adapter,Fragment 可以动态添加到 RecyclerView 上,实现复杂的界面分多个模块开发
- 为RecyclerView打造通用Adapter 让RecyclerView更加好用
- 为RecyclerView打造通用Adapter 让RecyclerView更加好用
- 为RecyclerView打造通用Adapter 让RecyclerView更加好用
- 为RecyclerView打造通用adapter
- 实现RecyclerView 的通用Adapter
- 为RecyclerView打造通用Adapter 让RecyclerView更加好用
- 为RecyclerView打造通用Adapter 让RecyclerView更加好用
- 为RecyclerView打造通用Adapter 让RecyclerView更加好用
- 打造通用的RecyclerView的Adapter
- 如何为Recyclerview写一个通用的adapter
- 为RecyclerView打造通用Adapter 让RecyclerView更加好用
- Android RecyclerView通用Adapter及item拖拽、滑动删除
- recyclerView通用适配器,支持添加多个header和footer
- 为RecyclerView打造通用Adapter 让RecyclerView更加好用
- RecyclerView封装Adapter之添加头部和底部视图