RecycleView的使用

技術概述

RecycleView是谷歌官方對ListView的改進(並不是替代),在效能和使用體驗上都有了較大的改善。在有限大小的空間上,需要呈現出數量不定的內容塊,且這些內容塊有一定重複性時,一般是讓其在可視空間內滾動。我們通常會優先選擇RecycleView實現這類功能,例如訊息列表、任務檢視等

技術詳述

在此之前,我們需要知道:

  • RecycleView:一個強大的滾動控制元件。
  • ViewHolder:容納和管理view檢視,也就是列表裡面的一個個子項。使用它可以讓程式碼不必每次都重新建立很多物件,從而使效能大大提示
  • RecycleView.adapter:管理ViewHolder

使用與實現:

一:在介面xml中引入RecycleView,根據需要定製一個小檢視的介面(就是需要重複的那一個個子項),然後使用xml文件實現它。

二:實現RecycleView.adapter
一個典型的實現應該是實現了RecycleView.adapter中的三大方法、一個內部類ViewHolder和一個List。例如:

    List<UserItem> musers;

    public static class ViewHolder extends RecyclerView.ViewHolder{}

    @NonNull
@Override
public GridAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {} @Override
public void onBindViewHolder(@NonNull GridAdapter.ViewHolder holder, int position) {} @Override
public int getItemCount() {}

一般來說,list用於存放子項的pojo。onCreateViewHolder用於建立ViewHolder。getItemCount用於告知List的長度(即子項的個數)。onBindViewHolder用於對每個子項執行具體的操作,可以根據position對具體子項對應的例項進行操作,例如點選後數值的改變等,在這裡。它會在每個子項滾動到螢幕內的時候執行。

三:引用。首先利用findViewById()例項化RecycleView。然後使用setLayoutManager設定LayoutManager以及使用setAdapter設定adapter。值得一提的是,絕大多數情況下,我們使用LinearLayoutManager,這樣呈現的就是常見的線性佈局。列舉兩個特殊一點的:

例如GridLayoutManager ,指定為4列,效果如下:





例如流式佈局,這個比較麻煩,建議使用開源控制元件,我們一般的歷史記錄,標籤等可以用這個實現,效果如下(網圖):

可參考流式佈局相關資料

四:篩選。如果需要對內容進行篩選,可將介面卡繼承Filterable介面

extends RecyclerView.Adapter<UserRecyclerViewAdapter.MyViewHolder> implements Filterable

此後需要完成介面要求實現的函式

@Override
public Filter getFilter() { return new Filter() {
//執行過濾操作
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
//執行某些需要的資料過濾操作 ,過濾內容存放在charSequence
} //把過濾後的值返回出來
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
...
notifyDataSetChanged();
}
};
}

再在需要recycleview有過濾的地方引用

Adapter.getFilter().filter(s.toString());

遇到問題和解決

問題一:當在子項中需要獲得context時(例如動態新增內容),在adapter中無論是使用getActivity還是getContext,一般情況下是無效的(除非是包含了當前view的引用的函式,那麼可以直接利用這個引用的context)。

解決:最簡單的解決方法就是在adapter建構函式中加入context形參,使用時需要傳入當前的context,這樣在adapter的每個需要的地方的可以正常使用需要context的api。

問題二:父檢視是RelativeLayout 或者 FrameLayout,無法動態新增控制元件。

解決:改為或者嵌入LinearLayout。

總結

總的來說,RecycleView是一個常用且功能強大的安卓控制元件。其高度的解耦性、靈活性賦予了它強大的可拓展性,使得它的檢視、業務邏輯的定製和複用更為方便。它很容易上手,但在某些方面卻又太過繁瑣。因此現在,GitHub上面也有了一些對其進行了一定改造的控制元件。但這些控制元件的規範程度、可拓展性還是稍遜一籌的,大部分只適用於特定場合。學會了RecycleView,對於其變形控制元件的學習也更加方便。

參考文獻

Android 控制元件 RecyclerView