安卓控件RecycleView的簡單使用
- 2021 年 6 月 27 日
- 筆記
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,對於其變形控件的學習也更加方便。