封装Recycleview的BaseAdapter

作者: 王小贱_ww | 来源:发表于2017-06-28 14:00 被阅读107次

    善于封装,提高开发效率,减少ctrl+c、ctrl+v,学会tou lan

    Recycleview的基本用法

    public class TestActivity extends AppCompatActivity {
        private RecyclerView mRecyclerView;
        private List<String> mDatas;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            initRecyclerView();
        }
    
        private void initRecyclerView() {
            mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
            mDatas = new ArrayList<>();
            for (int i = 0; i < 20; i++) {
                mDatas.add("item data is " + i);
            }
            mRecyclerView.setLayoutManager(new LinearLayoutManager(getApplication()));
            MyAdapter adapter = new MyAdapter();
            mRecyclerView.setAdapter(adapter);
        }
    
        class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    
    
            @Override
            public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_textview, parent, false);
                return new MyViewHolder(view);
            }
    
            @Override
            public void onBindViewHolder(MyViewHolder holder, int position) {
                holder.textview.setText(mDatas.get(position));
            }
    
            @Override
            public int getItemCount() {
                return mDatas.size();
            }
    
            class MyViewHolder extends RecyclerView.ViewHolder {
                TextView textview;
    
                public MyViewHolder(View itemView) {
                    super(itemView);
                    textview = (TextView) itemView.findViewById(R.id.item_textview);
                }
            }
        }
    }
    

    项目中有N个RecyclerView,岂不是要写N个Viewholder和N个Adapter(岂不是要累死),封装一个BaseAdapter减少代码量,还是很有必要的。

    1.关于ViewHolder的封装

    先看看ViewHolder都有哪些作用(提炼出来)1.onCreateViewHolder里面new Viewholder 2.绑定viewId和onBindViewHolder里面赋值

    public class ViewHolder extends RecyclerView.ViewHolder {
        private SparseArray<View> mViews;
        private View itemView;
    
        public ViewHolder(View itemView) {
            super(itemView);
            mViews = new SparseArray<>();
            this.itemView = itemView;
        }
    
        public ViewHolder get(Context context, ViewGroup parent, int layoutId) {
            View view = LayoutInflater.from(context).inflate(layoutId, parent, false);
            ViewHolder holder = new ViewHolder(view);
            return holder;
        }
    
        /**
         * 绑定viewId(泛型方法)
         * @param viewId
         * @param <T>
         * @return
         */
        public <T extends View> T getView(int viewId) {
            View view = mViews.get(viewId);
            if (view == null) {
                view = itemView.findViewById(viewId);
                mViews.put(viewId, view);
            }
            return (T) view;
        }
    
    
     /**
         * 给TextView赋值  根据项目需求你还可以添加setImageView、点击事件等等
         * @param viewId
         * @param text
         * @return
         */
        public ViewHolder setText(int viewId, String text) {
            TextView textView = getView(viewId);
            textView.setText(text);
            return this;
        }
    
    }
    

    2.BaseAdapter

    public abstract class CommonAdapter<T> extends RecyclerView.Adapter<ViewHolder> {
        private List<T> mDatas;
        private Context mContext;
        private int layoutId;
    
        public CommonAdapter(Context mContext, List<T> mDatas, int layoutId) {
            this.mDatas = mDatas;
            this.mContext = mContext;
            this.layoutId = layoutId;
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            /**
             * 创建Viewholder,绑定布局id,内部实现
             */
            ViewHolder holder = ViewHolder.get(mContext, parent, layoutId);
            return holder;
        }
    
        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            /**
             * 对于控件的赋值,需要子类自己实现,这里我们用抽象方法
             */
            convert(holder, mDatas.get(position));
    
        }
    
        @Override
        public int getItemCount() {
            return mDatas == null ? 0 : mDatas.size();
        }
    
        public abstract void convert(ViewHolder holder, T t);
    }
    

    3.简单使用

     mRecyclerView.setAdapter(new CommonAdapter<String>(this, mDatas, R.layout.item_textview) {
                @Override
                public void convert(ViewHolder holder, String o) {
                    holder.setText(R.id.item_textview, o);
                }
            });-----so easy
    

    相关文章

      网友评论

        本文标题:封装Recycleview的BaseAdapter

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