BaseQuickAdapter好在哪裏(更新中)

RecyclerView作爲一個很常用,很好用的控件,使用起來………………

1.有BaseQuickAdapter之前

有BaeQuickAdapter之前,想要使用RecyclerView需要做哪些工作?

1.1自定義Adapter繼承RecyclerView.Adapter

必須實現3個abstract方法:

  1. onCreateViewHolder方法

    參數:ViewGroup parent, int viewType

    用途:通過inflate創建view,傳遞給ViewHolder持有。可以根據viewType的不同,返回不同的ViewHolder。

    返回:自定義的ViewHolder類型的viewholder

  2. onBindViewHolder方法

    參數:viewholder,position

    用途:按照position取出item,對viewholder進行數據綁定,設置顯示內容、點擊等

  3. getItemCount

    用途:返回控件中要顯示的數據個數

另外,一般還需要自己定義一個list,持有數據列表。當按照position取數據的時候都需要從這個列表中讀取。

1.2自定義ViewHolder繼承RecyclerView.ViewHolder

包含item中的元素View,或者將綁定邏輯定義在這裏,以供onBindView調用。

1.3如何設置點擊事件,頭部尾部分割線?

2有BaseQuickAdapter之後

2.1自定義Adapter繼承BaseQuickAdapter

BaseQuickAdapter比起RecyclerView.Adapter用起來要方便很多,主要體現在以下幾個方面。

2.1.1不需要自己創建view,構造函數傳入了layoutId

繼承RecyclerView.Adapter需要自己在重寫的onCreateViewHolder方法中通過inflate創建view。
這裏我們根據RecyclerView中展示數據的佈局樣式是單一的還是多種的分爲兩類。
對於多種樣式的需求,RecyclerView.Adapter可以創建不同的view。如果是單一樣式的,使用RecyclerView.Adapter,每次都重寫這個方法就顯得麻煩了一些,而且每次都要重複去寫很多一樣的代碼。

BRVAH提供了兩種adapter,BaseQuickAdapter和BaseMultiItemQuickAdapter。
作爲單一樣式的Adapter,BaseQuickAdapter提供了很方便的設置佈局方法——構造函數直接接收layoutId作爲參數,不需要重複去寫創建view的過程。

雖然說是單一樣式,但是其實BaseQuickAdapter還可以設置頭部和腳部,只要中間是單一類型就可以用。

2.1.2自定義Adapter只需要實現一個方法

作爲BaseQuickAdapter的子類,只需要實現一個abstract方法——convert方法

參數:viewholder helper,T item

內容:與onBindViewHolder類似,進行數據綁定。只是這裏的helper是BaseViewHolder,作者爲BaseViewHolder封裝了很多好用的方法,下文具體講。

2.1.3替我們實現了3個方法

BaseQuickAdapter繼承RecyclerView.Adapter,替我們實現了3個abstract方法:

  1. onCreateViewHolder

    switch (viewType),根據不同的viewType創建ViewHolder,viewType包括頭部、尾部、loading、空狀態和普通的數據。

    ***創建ViewHolder的方法還涉及泛型的知識。

  2. onBindViewHolder

    對於頭部尾部等ViewType的數據,都不需要綁定,對於普通類型的數據,調用我們實現的convert方法即可,需要注意的是,這裏傳遞給convert的position其實是RecyclerView.Adapter中的position去掉頭部之後的。

  3. getItemCount

    考慮是否是空頁面的情況,如果是空頁面返回頭部尾部等的個數;如果不是空頁面,返回mdata的長度+頭部尾部個數。

2.2方便好用的BaseViewHolder

使用BaseViewHolder繼承自RecyclerView.ViewHolder,它提供了封裝好的方法,供開發者方便地進行數據綁定。如果沒有特殊需求,只是要進行一些控件的屬性設置,不需要重新寫一個新的子類去繼承BaseViewHolder了。

2.2.1 一般屬性類

對於不同的控件,BaseViewHolder直接提供了很多設置屬性的方法。
例如對於TextView空間,可以直接調用helper.setText()對其設置text內容,傳入參數爲view的id和字符內容。源碼:

public BaseViewHolder setText(@IdRes int viewId, CharSequence value) {
        TextView view = getView(viewId);
        view.setText(value);
        return this;
    }

其他的如imageView,CheckBox等也提供了setImageResoure/Gone/Checked等方法。

2.2.2 鏈式調用

通過上一小節給出的源碼可以看見,setXXX方法返回的還是BaseViewHolder,所以可以鏈式調用,使用方便,可讀性好。

2.2.3如何設置控件的點擊事件和子view的點擊事件

BaseViewHolder對設置控件點擊事件的方法做了統一封裝:addOnClickListener和addOnLongClickListener。

這兩個方法的傳入參數都是view的id,然後調用View的setOnClickListener和setOnLongClickListener方法給他們設置點擊的回調函數,這裏的回調函數是BaseQuickAdapter中的mOnItemChildClickListener和mOnItemChildLongClickListener兩個函數。

private OnItemChildClickListener mOnItemChildClickListener;
private OnItemChildLongClickListener mOnItemChildLongClickListener;

所以在使用的時候需要調用BaseQuickAdapter的兩個set方法:

/**
 * Register a callback to be invoked when an itemchild in View has
 * been  clicked
 *
 * @param listener The callback that will run
 */
public void setOnItemChildClickListener(OnItemChildClickListener listener) {
    mOnItemChildClickListener = listener;
}

/**
     * Register a callback to be invoked when an item in this RecyclerView has
     * been long clicked and held
     *
     * @param listener The callback that will run
     */
    public void setOnItemLongClickListener(OnItemLongClickListener listener) {
        mOnItemLongClickListener = listener;
    }

雖然也支持直接setOnClickListener給某一個view,但是作者更加推薦的是這種方法。

private OnItemClickListener mOnItemClickListener;
private OnItemLongClickListener mOnItemLongClickListener;
private OnItemChildClickListener mOnItemChildClickListener;
private OnItemChildLongClickListener mOnItemChildLongClickListener;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章