RecyclerView系列(9)—自定义Adapter(基础篇)

0.前言

本文目的主要是通过自定义个adapter来学习adapter内各个回调方法的含义。
那么提前先把要分析的本文的重点罗列出来。

  • Adapter#onCreateViewHolder //主流程
  • Adapter#onBindViewHolder //主流程
  • Adapter#convert //解耦
  • ViewHolder#get //扩展,渲染
  • ViewHolder#getView //扩展

1.自定义ViewHolder


    public class ViewHolder extends RecyclerView.ViewHolder {

        private SparseArray<View> mViews;
        private View mConvertView;

        public ViewHolder(Context context, View itemview, ViewGroup parent) {
            super(itemview);
            mConvertView = itemview;
            mViews = new SparseArray<View>();
        }

        public static ViewHolder get(Context context, ViewGroup parent, int layoutid) {
            View itemview = LayoutInflater.from(context).inflate(layoutid, parent, false);
            ViewHolder holder = new ViewHolder(context, itemview, parent);
            return holder;
        }

        public <T extends View> T getView(int viewid) {
            View view = mViews.get(viewid);
            if (view == null) {
                view = mConvertView.findViewById(viewid);
                mViews.put(viewid, view);
            }
            return (T) view;
        }
    }

ViewHolder作为RecyclerView的条目容器,它穿梭于adapter的俩个方法之间,一个是onCreateViewHolder(初始化),一个是OnBinderViewHolder。这俩方法待会说,我们先分析下代码。

get()

这个方法名儿随便起,内容主要就是进行一个条目的渲染,这里很重要,一些扩展的封装会涉及在这里,比如下一篇文章我们要封装的HeaderView,会在这里来判断。

getView()

根据id获取view的方法。一个扩展功能。

2.自定义MyAdapter

onCreateViewHolder

在这里进行条目的渲染。

convert

为了解耦,抽象封装的一个方法。

onBindViewHolder

为条目进行布局。若是监测到是header或是footer则不进行常规布局。

getItemCount

获取列表长度。

getItemViewType

这个方法在本例内没体现,但是在下一篇中会出现,它主要就是用来判断header条目的。这么判断?public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType),这个方法第三个参数返回的就是这个方法内写好的返回逻辑。


    package android.zj.com.rcvheaderdemo;

    import android.content.Context;
    import android.support.v7.widget.RecyclerView;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import java.util.List;

    public abstract class MyAdapter<T> extends RecyclerView.Adapter<ViewHolder> {

        private Context mContext;
        private int mLayoutid;
        private List<T> mDatas;
        private AdapterView.OnItemClickListener monItemClickListener = null;

        public MyAdapter(Context mContext, int mLayoutid, List<T> mDatas) {
            this.mContext = mContext;
            this.mLayoutid = mLayoutid;
            this.mDatas = mDatas;
        }

        /**
         * inflate操作
         * */
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            ViewHolder viewHolder = ViewHolder.get(mContext, parent, mLayoutid);
            return viewHolder;
        }

        /**
         * 暴露出来的接口
         * 
         * @param holder
         * @param position
         */
        public abstract void convert(ViewHolder holder, T position);

        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            convert(holder, mDatas.get(position));
        }

        /**
         * 获取高度
         *
         * @return
         */
        @Override
        public int getItemCount() {
            if (mDatas == null) {
                return 0;
            }
            return mDatas.size();
        }

    }

3.测试类编写


    package android.zj.com.rcvheaderdemo;

    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;

    import java.util.ArrayList;
    import java.util.List;

    public class MainActivity extends AppCompatActivity {

        private RecyclerView mRecyclerView;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            mRecyclerView = findViewById(R.id.rcv);
            mRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL,false));
            List arr = new ArrayList();
            for (int i = 0; i < 15; i++) {
                arr.add("" + i);
            }

            MyAdapter mMyAdapter = new MyAdapter(MainActivity.this, R.layout.item_hot_phone_search, arr) {
                @Override
                public void convert(ViewHolder holder, Object position) {

                }
            };

            mRecyclerView.setAdapter(mMyAdapter);
        }

    }

4.Demo:

https://github.com/zj614android/customRcAdapter

5.Thanks

基本方法1:https://blog.csdn.net/qibin0506/article/details/49716795
基本方法2:https://blog.csdn.net/qq_38228254/article/details/78374348
rcv设计思想:https://www.jianshu.com/p/9ddfdffee5d3

扫描二维码关注公众号,回复: 2844311 查看本文章

猜你喜欢

转载自blog.csdn.net/user11223344abc/article/details/81708502