BaseRecycleViewAdapter的封装,基于多种bean数据源的呈现
来源:互联网 发布:mathtype 矩阵虚线 编辑:程序博客网 时间:2024/06/05 14:47
写在前面:最近项目上需要,这是一点记录
一.需求:
recycleview中可以实现多种不同的bean,加载不同的数据源内容在同一个adapter上。(以下用两种举例)
二.思路
1.首先需要两种list data,呈现在一个adapter上时,需要根据位置来进行区别,RecyclerView.Adapter中的getItemViewType可以很好的区别多种数据类型
2.你有多少种bean,就需要多少种viewholder
三.以下是代码,提供注释
//我这里用两种数据源,多种可适当增加<T, K,...>泛型public abstract class BaseRecycleViewAdapter<T, K> extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private static final String TAG = "zht"; private static final int TYPE_FOLDER = 0; private static final int TYPE_PHOTO = 1; protected List<T> mData1; protected List<K> mData2; protected Context mContext; protected LayoutInflater mLayoutInflater; protected int mLayoutResId1;//这里是实现不同数据源的呈现的布局1 protected int mLayoutResId2;//这里是实现不同数据源的呈现的布局2 private OnRecycleViewItemClickListener onRecycleViewItemClickListener; private OnRecycleViewItemLongClickListener onRecycleViewItemLongClickListener; public BaseRecycleViewAdapter(Context context, List<T> data1, List<K> data2) { mLayoutResId1 = attachLayoutRes1(); mLayoutResId2 = attachLayoutRes2(); if (data1 == null || data2 == null) { mData1 = new ArrayList<>(); mData2 = new ArrayList<>(); } else { this.mData1 = data1; this.mData2 = data2; } this.mContext = context; this.mLayoutInflater = LayoutInflater.from(mContext); } //以下四个方法会在子类adapter中使用 protected abstract int attachLayoutRes1(); protected abstract int attachLayoutRes2(); //这里是绑定数据,你有多少个数据源写多少个绑定数据 protected abstract void convert(BaseViewHolder_One holder, T item1); protected abstract void convertOther(BaseViewHolder_Two holder, K item2); @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = null; RecyclerView.ViewHolder holder = null; switch (viewType) { case TYPE_FOLDER: view = mLayoutInflater.inflate(mLayoutResId1, parent, false); holder = new BaseViewHolder_One(view, mContext); break; case TYPE_PHOTO: view = mLayoutInflater.inflate(mLayoutResId2, parent, false); holder = new BaseViewHolder_Two(view, mContext); break; } View finalView = view; RecyclerView.ViewHolder finalHolder = holder; view.setOnClickListener(v -> onRecycleViewItemClickListener.onItemClick(finalView, finalHolder.getLayoutPosition())); view.setOnLongClickListener(v -> onRecycleViewItemLongClickListener.onItemLongClick(finalView, finalHolder.getLayoutPosition())); return holder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { switch (getItemViewType(position)) { case TYPE_FOLDER: convert((BaseViewHolder_One) holder, mData1.get(position)); break; case TYPE_PHOTO: convertOther((BaseViewHolder_Two) holder, mData2.get(position - mData1.size())); break; } } @Override public int getItemCount() { return mData1.size() + mData2.size(); } @Override public long getItemId(int position) { return position; }//这里就是将多种数据源拼接在一起,我简单的在上一个数据源的结尾拼接 @Override public int getItemViewType(int position) { if (position < mData1.size()) { if (mData1.get(position) instanceof FOLDERS) { return TYPE_FOLDER; } } if (position >= mData1.size()) { if (mData2.get(position - mData1.size()) instanceof PHOTOS) { return TYPE_PHOTO; } } return TYPE_FOLDER; } public void setOnRecycleViewItemClickListener(OnRecycleViewItemClickListener onRecycleViewItemClickListener) { this.onRecycleViewItemClickListener = onRecycleViewItemClickListener; } public void setOnRecycleViewItemLongClickListener(OnRecycleViewItemLongClickListener onRecycleViewItemLongClickListener) { this.onRecycleViewItemLongClickListener = onRecycleViewItemLongClickListener; }//--------------------------以下是一些基本的功能------------------------------- /** * 添加一条数据,尾部插入数据 */ public void addItem(T item) { if (mData1 == null || mData1.size() == 0) { mData1 = new ArrayList<>(); mData1.add(item); Log.i(TAG, "addItem: mData=" + item.toString()); } else { mData1.add(item); } notifyDataSetChanged(); } /** * 删除某条数据 */ public void deleteItem(int position) { mData1.remove(position); notifyItemRemoved(position); } public void addFolderList(List<T> data) { mData1.addAll(data); notifyDataSetChanged(); } public void addPhotoList(List<K> data) { mData2.addAll(data); notifyDataSetChanged(); } /** * 获取数据1 */ public List<T> getmData() { return mData1; } /** * 获取数据2 */ public List<K> getmData2() { return mData2; } /** * 清空数据 */ public void deleteAll() { Log.i(TAG, "deleteAll:mData1.size= " + mData1.size()); Log.i(TAG, "deleteAll: mData2=" + mData2.size()); mData1.clear(); mData2.clear(); notifyDataSetChanged(); }}
子类viewholder的实现,两种数据源有两种viewholder
1.简单的呈现一下
public class BaseViewHolder_One extends RecyclerView.ViewHolder { View convertView; Context context; public BaseViewHolder_One(View itemView, Context context) { super(itemView); this.convertView = itemView; this.context = context; } public void setText(int id, String text) { TextView tx = (TextView) convertView.findViewById(id); tx.setText(text); } public void setImageResource(int id, int resouceId) { ImageView img= (ImageView) convertView.findViewById(id); Glide.with(context).load(resouceId).into(img); }}
2.简单的呈现一下
public class BaseViewHolder_Two extends RecyclerView.ViewHolder { View convertView; Context context; public BaseViewHolder_Two(View itemView, Context context) { super(itemView); this.convertView = itemView; this.context = context; } public void setText(int id, String text) { TextView tx = (TextView) convertView.findViewById(id); tx.setText(text); } public void setImageResource(int id, String url) { ImageView img= (ImageView) convertView.findViewById(id); Glide.with(context).load(url).into(img); }}
3.子类adapter,你有了个强大的baserecycleviewadapter,那么子类就很简单了,以下代码
public class HomeListAdapter extends BaseRecycleViewAdapter<FOLDERS, PHOTOS> { public HomeListAdapter(Context context, List<FOLDERS> data1, List<PHOTOS> data2) { super(context, data1, data2); } @Override protected int attachLayoutRes1() { return R.layout.item_rv_folder; } @Override protected int attachLayoutRes2() { return R.layout.item_rv_photo; } @Override protected void convert(BaseViewHolder_One holder, FOLDERS item1) { holder.setText(R.id.tv_folder_item,item1.getFOLDER()); holder.setImageResource(R.id.iv_folder_item,R.mipmap.folder); } @Override protected void convertOther(BaseViewHolder_Two holder, PHOTOS item2) { holder.setImageResource(R.id.iv_photo_item,item2.getIMAGE_LOCATION()); holder.setText(R.id.tv_photo_item,item2.getFILE_NAME()); }}
数据是来源数据库的不同表的内容,mvp+dagger2+rxjava+greendao3的编写,慢慢的一点点进步
1 0
- BaseRecycleViewAdapter的封装,基于多种bean数据源的呈现
- 简单的封装BaseRecycleviewAdapter
- 自己封装的数据源(支持多种数据库访问,内部实现线程池 基于bonecp)
- BaseRecycleViewAdapter 、BaseQuickAdapter、BaseAdapter 的用法区别
- 封装的多种实现
- 基于AlertDialog和Dialog封装的多种弹出框样式
- bean作为jasperReport 的数据源
- 基于Okhttp3的简单封装,Bean,String数据返回
- Android设置TextView字体呈现多种颜色的方法
- Spring整合Hibernate的多种数据源配置
- Spring--多种Bean的注入(上)
- Spring--多种Bean的注入(中)
- Spring--多种Bean的注入(下)
- 编写整洁的TableView代码--基于Block的TableView/CollectionView数据源封装
- 基于数据源的数据绑定
- Spring 基于JDBC的数据源
- 基于数据源的数据绑定
- win2k环境下基于JBOSS的J2EE开发实践----之三、有状态会话 Bean的开发及多种调用有状态会话Bean方法的实现
- 加载Selenium2Library却显示红色
- android 屏幕适配
- 553 mail from must equal authorized user
- 算法:Map排序-KEY排序、VALUE排序()([0-9][A-Z][a-z])从小到大排序
- iTunes Connect
- BaseRecycleViewAdapter的封装,基于多种bean数据源的呈现
- Lua的线程和状态 及协程
- 相关网址
- ffmpeg命令行录屏和录音(麦克风+扬声器)并rtmp推流
- java全角转半角,半角转全角的方法
- bp神经网络学习
- listview 复用数据错误以及listview item中的控件之间修改状态
- ISCSI HBA卡和普通网卡的区别
- python format的应用