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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章