1.簡介
用戶滑動屏幕切換視圖時,上一個視圖會回收利用,RecyclerView所做的就是回收再利用,循環往復。
-
ViewHolder
ViewHolder的主要任務:容納View視圖。 -
Adapter
Adapter從模型層獲取數據,然後提供給RecyclerView顯示,是溝通的橋樑。 -
Adapter主要的任務是:創建ViewHolder和將模型層的數據綁定到ViewHolder上。
RecyclerView與Adapter交互流程
首先,調用Adapter.getItemCount()方法,RecyclerView詢問數組列表中包含多少個待展示的視圖。
接着,RecyclerView調用Adapter.onCreateViewHolder(ViewGroup, int)創建ViewHolder。
最後,RecyclerView會傳入ViewHolder及其位置(position),調用onBindViewHolder(ViewHolder, int)方法。Adapter會找到目標位置的數據並將其綁定到ViewHolder的視圖上。
需要注意的是相對於onBindViewHolder(),onCreateViewHolder()方法調用並不頻繁。一旦有了夠用的ViewHolder,RecyclerView就會停止調用onCreateViewHolder()方法。隨後,它會回收利用舊的ViewHolder以節約時間和內存。
- LayoutManager
RecyclerView不會親自擺放屏幕上的列表項,擺放列表項的任務被委託給了LayoutManager。除了在屏幕上擺放列表項,LayoutManager還負責定義屏幕滾動行爲。
除了一些Android系統內置版實現,LayoutManager還有很多第三方庫實現版本。
2.ViewHolder
ViewHolder承載的是每一個列表項的視圖,所以當使用RecyclerView的時候需要先對ViewHolder進行初始化定義。
private class CrimeHolder extends RecyclerView.ViewHolder {
public CrimeHolder(LayoutInflater inflater, ViewGroup parent) {
super(inflater.inflate(R.layout.list_item_crime, parent, false));
}
}
注意到CrimeHolder構造器方法調用了父類構造器super(View view)----ViewHolder(View view)。因而CrimeHolder實際上引用了已被實例化的list_item_crime佈局的視圖,且同時這個視圖被賦給了父類變量itemView,我們可以在itemView變量處獲得該視圖。
3.Adapter
當需要顯示新創建的ViewHolder或讓數據和已創建的ViewHolder關聯時,就會用到Adapter。在Adapter中通常需要實現3個方法:
- onCreateViewHolder(ViewGroup parent, int viewType)
當需要新的ViewHolder來顯示列表項時,會調用onCreateViewHolder方法去創建ViewHolder。
public CrimeHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
return new CrimeHolder(layoutInflater, parent);
}
- onBindViewHolder(CrimeHolder holder, int position)
將數據綁定在ViewHolder上。
public void onBindViewHolder(CrimeHolder holder, int position) {
holder.bind(position);
}
- getItemCount()
返回總共要顯示的列表的數量(創建的ViewHolder數量比前者要小得多)。
public int getItemCount() {
return list.size();
}