RecyclerView.Adapter通用性
2017-10-30 14:02
49 查看
对于一个写代码有洁癖、始终重复的写同样而不简洁的代码,是无法忍受的。
一个APP中,RecyclerView和ListView的使用会比较频繁。需要的时候,都会重复的写Adapter。这样使得不够通用,不够简洁。下面就针对RecyclerView.Adapter展开来写。
RecyclerView是由多个item组成的,这里我们可以把每一项item看成一个DataHolder, DataHolder的代码如下:
1.构造函数中两个参数,第一个参数data是一个实体类(界面上需要展示的数据),第二个参数type是item的布局类型(Adapter中可以有多种不同类型的布局)
2.两个抽象方法onCreateView()和onBindView()是不是很眼熟。没错,就是仿照Adapter的onCreateViewHolder()和onBindViewHolder()写的,用法大致相同,前者初始化布局,后者设置数据。
RecyclerView中使用ViewHolder来缓存布局,避免多次实例化,也仿照写了GenericViewHolder,如下:
1.构造函数中itemView就是onCreateView()中初始化的布局,params就是初始化的控件
2.getParams();获取初始化的控件
最重要的Adapter来了,GenericAdapter继承RecyclerView.Adapter,如下:
1.重写onCreateViewHolder,该方法中调用了queryDataHolder()方法,此方法是根据布局类型,找出对应该类型的DataHolder;找到对应的DataHolder后,在调用不同类型布局的onCreateView(),分别进行实例化。
2.重写onBindViewHolder,该方法会执行DataHolder中的onBindView(),用来设置数据
3.addDataHolder()方法,向Adapter中添加item
4.addDataHolders()方法,向Adapter中添加数据集的item
demo地址:https://github.com/SimpleWei00/GenericAdapter
一个APP中,RecyclerView和ListView的使用会比较频繁。需要的时候,都会重复的写Adapter。这样使得不够通用,不够简洁。下面就针对RecyclerView.Adapter展开来写。
RecyclerView是由多个item组成的,这里我们可以把每一项item看成一个DataHolder, DataHolder的代码如下:
public abstract class DataHolder { private Object mData = null; private int mType; public DataHolder(Object data, int type){ mData = data; mType = type; } public abstract GenericViewHolder onCreateView(Context context); public abstract void onBindView(Context context, GenericViewHolder holder, int position, Object data); public Object getData() { return mData; } public int getType() { return mType; } }
1.构造函数中两个参数,第一个参数data是一个实体类(界面上需要展示的数据),第二个参数type是item的布局类型(Adapter中可以有多种不同类型的布局)
2.两个抽象方法onCreateView()和onBindView()是不是很眼熟。没错,就是仿照Adapter的onCreateViewHolder()和onBindViewHolder()写的,用法大致相同,前者初始化布局,后者设置数据。
RecyclerView中使用ViewHolder来缓存布局,避免多次实例化,也仿照写了GenericViewHolder,如下:
public class GenericViewHolder extends RecyclerView.ViewHolder { protected View[] mParams = null; protected Object mTag = null; public GenericViewHolder(View itemView,View... params) { super(itemView); mParams = params; } public void setParams(View... params) { mParams = params; } public View[] getParams() { return mParams; } public void setTag(Object tag) { mTag = tag; } public Object getTag() { return mTag; } }
1.构造函数中itemView就是onCreateView()中初始化的布局,params就是初始化的控件
2.getParams();获取初始化的控件
最重要的Adapter来了,GenericAdapter继承RecyclerView.Adapter,如下:
public class GenericAdapter extends RecyclerView.Adapter<GenericViewHolder> { private Context mContext = null; private List<DataHolder> mHolders = null; public GenericAdapter(Context context){ mContext = context; mHolders = new ArrayList<>(); } public Context getContext(){ return mContext; } public void addDataHolder(DataHolder holder) { mHolders.add(holder); // notifyDataSetChanged(); } public void addDataHolder(int location, DataHolder holder) { mHolders.add(location, holder); notifyDataSetChanged(); } public void addDataHolders(List<DataHolder> holders) { mHolders.addAll(holders); notifyDataSetChanged(); } public void addDataHolders(int location, List<DataHolder> holders) { mHolders.addAll(location, holders); notifyDataSetChanged(); } public void removeDataHolder(int location) { mHolders.remove(location); notifyDataSetChanged(); } public void removeDataHolder(DataHolder holder) { mHolders.remove(holder); notifyDataSetChanged(); } public void removeDataHolders(int start){ int size = mHolders.size(); if(start >=0 && start < size){ while(start < size){ mHolders.remove(size - 1); size = mHolders.size(); } } notifyDataSetChanged(); } public void clearDataHolders(boolean isNotify){ mHolders.clear(); if(isNotify)notifyDataSetChanged(); } public List<DataHolder> getData(){ return mHolders; } /** * 根据布局类型查DataHolder * @param viewType * @return */ public DataHolder queryDataHolder(int viewType) { int size = mHolders.size(); for(int i = 0 ; i < size;i++){ DataHolder holder = mHolders.get(i); if(viewType == holder.getType()){ return holder; } } return null; } @Override public GenericViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { DataHolder holder = queryDataHolder(viewType); return holder.onCreateView(mContext); } @Override public final void onBindViewHolder(GenericViewHolder viewHolder, int position) { DataHolder holder = mHolders.get(position); holder.onBindView(mContext,viewHolder,position,holder.getData()); } @Override public final int getItemCount() { return mHolders.size(); } @Override public int getItemViewType(int position) { return mHolders.get(position).getType(); } @Override public final long getItemId(int position) { return super.getItemId(position); } }
1.重写onCreateViewHolder,该方法中调用了queryDataHolder()方法,此方法是根据布局类型,找出对应该类型的DataHolder;找到对应的DataHolder后,在调用不同类型布局的onCreateView(),分别进行实例化。
2.重写onBindViewHolder,该方法会执行DataHolder中的onBindView(),用来设置数据
3.addDataHolder()方法,向Adapter中添加item
4.addDataHolders()方法,向Adapter中添加数据集的item
demo地址:https://github.com/SimpleWei00/GenericAdapter
相关文章推荐
- Android开源之BaseRecyclerViewAdapterHelper(持续更新!)
- Android RecyclerView Adapter及Holder的封装【原创】
- PowerfulRecyclerViewAdapter:一种RecyclerView的万能适配器实现
- RecyclerView.Adapter的封装
- RecyclerView之BaseRecyclerViewAdapterHelper(一)
- BaseRecyclerViewAdapterHelper 实现不同条目的列表
- HeaderAndFooterRecyclerViewAdapter
- 为RecyclerView打造通用Adapter 让RecyclerView更加好用
- 基类RecyclerViewAdapter以及BaseViewHolder。减少适配器的重复代码量
- Android 对ListView和RecyclerView的两个BaseAdapter封装分享
- Recyclerview 点击事件区别 getPosition() ,getLayoutPosition(),getAdapterPosition()
- XAdapter 一个支持 add 多个 header 和 footer,并且支持下拉刷新上拉加载的 recyclerViewAdapter
- RecyclerView: No adapter attached; skipping layout
- 继承RecyclerView.Adapter使用泛型遇到的问题
- 为RecyclerView打造通用Adapter 让RecyclerView更加好用
- Android之RecyclerView的原生Bug-Inconsistency detected. Invalid view holder adapter positionViewHolder{a1bbfa3 position=2 id=-1, oldPos=-1, pLpos:-1 no parent}
- 简化代码——RecyclerView.Adapter的封装
- RecyclerView Adapter 优雅封装,一个Adapter搞定所有列表
- RecyclerView 横向列表 及 adapter 打造 item监听 改变元素属性
- RecyclerView.Adapter封装,包括点击监听,长按监听,继承时不需要重新设置