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
原创粉丝点击