美文网首页高级UI
RecyclerView系列之(二)— Adapter的封装

RecyclerView系列之(二)— Adapter的封装

作者: d41f12d62517 | 来源:发表于2019-11-03 12:25 被阅读0次

    简单封装

    分析简单调用之后,看看什么部分是可以抽取出来,做一个BaseAdapter 的封装。封装 BaseAdapter 的目标就是再调用的时候能减少重复写的代码,提升 coding 的效率。

    回顾上篇说的简单调用,在使用 RecyclerView 的时候需要编写 Adapter 和 ViewHolder 。在自己封装的时候,参照 BaseRecyclerViewAdapterHelper 对Adapter的封装实现。

    封装思路

    在使用RecyclerView 的时候,如果不做封装每次都得写很多的代码。在简单的使用我们只需要关注两点:
    1、如何将 item layout 与Adapter 进行绑定。
    2、如何给 item layout 中的控件设置数据。
    3、如何不用每次都写 ViewHolder。

    最终达到的效果:

    public class BaseTestAdapter extends BaseAdapter<BaseTestBean, BaseViewHolder> {
    
        public BaseTestAdapter(List<BaseTestBean> datas) {
            super(R.layout.layout_item_base_test,datas);
        }
    
        @Override
        public void convert(BaseViewHolder holder, int position) {
    
            BaseTestBean baseTestBean = getDatas().get(position);
    
            holder.setText(R.id.tv_content,baseTestBean.getItemContent());
    
        }
    
    }
    

    BaseAdapter 就是我们封装好的 Adapter 基础类。BaseViewHolder是对 ViewHolder 封装。

    Item layout 通过构造函数传递绑定。数据也同时通过构造函数传递到 Adapter中。数据展示通过 convert 进行展示以及处理。

    BaseAdapter 封装的整体代码如下:

    public abstract class BaseAdapter<K,T extends BaseViewHolder> extends RecyclerView.Adapter<T> {
    
        private int layoutId;
    
        private List<K> datas;
    
        private OnItermClickLitener mOnItermClickLitener;
        private OnItermLongClickListener mOnItermLongClickListener;
    
        public BaseAdapter(int layoutId) {
            this.layoutId = layoutId;
        }
    
        public BaseAdapter(int layoutId, List<K> datas) {
            this.layoutId = layoutId;
            this.datas = datas;
        }
    
        @NonNull
        @Override
        public T onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    
            T baseViewHolder = null;
    
            View view = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
    
            baseViewHolder = (T) new BaseViewHolder(view);
            bindViewClickListener(baseViewHolder);
    
            return baseViewHolder;
        }
    
        @Override
        public void onBindViewHolder(@NonNull T holder, int position) {
            convert(holder,position);
        }
    
        @Override
        public int getItemCount() {
            return datas != null ? datas.size() : 0;
        }
    
        public List<K> getDatas() {
            return datas;
        }
    
        public void setDatas(List<K> datas) {
            this.datas = datas;
        }
    
        public void setOnItermClickLitener(OnItermClickLitener onItermClickLitener) {
            mOnItermClickLitener = onItermClickLitener;
        }
    
        public void setOnItermLongClickListener(OnItermLongClickListener onItermLongClickListener) {
            mOnItermLongClickListener = onItermLongClickListener;
        }
    
        protected void bindViewClickListener(final T viewHolder){
            if(viewHolder == null) return;
    
            View itemView = viewHolder.itemView;
    
            if(itemView == null) return;
    
            if(mOnItermClickLitener != null){
                itemView.setOnClickListener(v -> {
                    int position = viewHolder.getAdapterPosition();
                    mOnItermClickLitener.onItermClick(BaseAdapter.this,v,position);
                });
            }
    
            if(mOnItermLongClickListener != null){
                itemView.setOnLongClickListener(v -> {
                    int position = viewHolder.getAdapterPosition();
                    boolean handler = mOnItermLongClickListener.onItermLongClick(BaseAdapter.this, v, position);
                    return handler;
                });
            }
        }
    
        public abstract void convert(T holder, int position);
    
        public interface OnItermClickLitener{
            void onItermClick(BaseAdapter adapter,View view,int position);
        }
    
        public interface OnItermLongClickListener{
            boolean onItermLongClick(BaseAdapter adapter,View view,int position);
        }
    
    }
    

    简单的代码封装实现原理比较的简单,具体看代码就可以理解,Base封装完之后,之后的项目就可以根据实际使用的情况进行更深一部的封装或者扩展。

    相关文章

      网友评论

        本文标题:RecyclerView系列之(二)— Adapter的封装

        本文链接:https://www.haomeiwen.com/subject/cvgkmctx.html