RecyclerView 元件和功能
RecyclerView
在內部處理某些工作(例如檢視的捲動和回收),但基本上是協調協助程序類別以顯示集合的管理員。 RecyclerView
將工作委派給下列協助程式類別:
Adapter
– 擴充專案配置(具現化版面配置檔案的內容),並將數據系結至 中顯示的RecyclerView
檢視。 配接器也會報告項目點擊事件。LayoutManager
– 在 中RecyclerView
測量和定位項目檢視,並管理檢視回收的原則。ViewHolder
– 查閱和儲存檢視參考。 檢視持有者也有助於偵測項目檢視點選。ItemDecoration
– 允許應用程式將特殊的繪圖和版面配置位移新增至專案、醒目提示和視覺群組界限之間的特定檢視。ItemAnimator
– 定義在專案動作期間發生的動畫,或當變更配接器時所發生的動畫。
下圖描述、 LayoutManager
類別 Adapter
之間的RecyclerView
關聯性:
如圖所示,LayoutManager
可以視為 和 RecyclerView
之間的Adapter
媒介。 會LayoutManager
代表 RecyclerView
對方法進行呼叫Adapter
。 例如,在是時候為 中RecyclerView
特定專案位置建立新檢視時,呼叫 LayoutManager
Adapter
方法。 會 Adapter
擴大該專案的配置,並建立 ViewHolder
實例(未顯示),以快取該位置檢視的參考。 LayoutManager
當呼叫 Adapter
以將特定項目系結至數據集時,會Adapter
找出該專案的數據、從數據集擷取數據,並將它複製到相關聯的項目檢視。
在應用程式中使用 RecyclerView
時,需要建立下列類別的衍生類型:
RecyclerView.Adapter
– 提供應用程式數據集的系結(這是您的應用程式專屬的),以及顯示在 內RecyclerView
的項目檢視。 配接器知道如何將 中的每個RecyclerView
項目檢視位置與數據源中的特定位置產生關聯。 此外,配接器會處理每個個別項目檢視中內容的配置,併為每個檢視建立檢視持有者。 配接器也會報告項目檢視所偵測到的項目點擊事件。RecyclerView.ViewHolder
– 快取專案配置檔案中檢視的參考,讓資源查閱不會不必要重複。 當使用者點選檢視持有人的相關項目檢視時,檢視持有者也會安排要轉送至適配卡的項目點擊事件。RecyclerView.LayoutManager
– 在 內RecyclerView
放置專案。 您可以使用數個預先定義的版面配置管理員之一,也可以實作自己的自定義版面配置管理員。RecyclerView
將配置原則委派給配置管理員,因此您可以插入不同的版面配置管理員,而不需要對您的應用程式進行重大變更。
此外,您可以選擇性地擴充下列類別,以變更應用程式中的外觀和風格 RecyclerView
:
RecyclerView.ItemDecoration
RecyclerView.ItemAnimator
如果您未擴充 ItemDecoration
和 ItemAnimator
, RecyclerView
則會使用預設實作。 本指南不會說明如何建立自定義 ItemDecoration
和 ItemAnimator
類別;如需這些類別的詳細資訊,請參閱 RecyclerView.ItemDecoration 和 RecyclerView.ItemAnimator。
檢視回收的運作方式
RecyclerView
不會為數據源中的每個專案配置項目檢視。 相反地,它會只配置畫面上符合的項目檢視數目,並在使用者捲動時重複使用這些專案配置。 當檢視第一次捲動出視線時,它會經過下圖所示的回收程式:
當檢視卷動離開視線且不再顯示時,它就會變成 廢止檢視。
廢品檢視會放在集區中,並成為 回收檢視。 此集區是顯示相同數據類型之檢視的快取。
顯示新專案時,會從回收池取得檢視以供重複使用。 由於此檢視必須先由配接器重新系結再顯示,所以稱為 「臟檢視」。
已回收臟檢視:配接器會找出要顯示下一個項目的數據,並將此數據複製到此項目的檢視。 從與回收檢視相關聯的檢視持有者擷取這些檢視的參考。
已回收的檢視會新增至即將上螢幕的項目
RecyclerView
清單。當使用者捲動
RecyclerView
至清單中的下一個專案時,回收的檢視會進入畫面。 同時,另一個檢視會從視線中捲動,並根據上述步驟回收。
除了項目檢視重複使用之外, RecyclerView
也會使用另一個效率優化:檢視持有者。 檢視持有者是可快取檢視參考的簡單類別。 每次配接器擴充專案配置檔案時,也會建立對應的檢視持有者。 檢視持有者會使用 FindViewById
來取得擴充專案配置檔案內檢視的參考。 每次回收配置以顯示新數據時,這些參考會用來將新數據載入檢視中。
版面配置管理員
版面配置管理員負責將專案定位在顯示器中 RecyclerView
;它會決定簡報類型(清單或網格線)、方向(無論是垂直或水平顯示專案),以及應以一般順序或反向順序顯示哪些方向專案。 配置管理員也會負責計算回收檢視顯示中每個專案的大小和位置。
版面配置管理員有其他用途:它會決定何時回收用戶無法再看見的項目檢視。 因為版面配置管理員知道哪些檢視是可見的(哪些不是),所以決定何時可以回收檢視是最佳位置。 若要回收檢視,版面配置管理員通常會呼叫適配卡,以不同的數據取代已回收檢視的內容,如檢視回收的運作方式中所述。
您可以擴充 RecyclerView.LayoutManager
以建立自己的版面配置管理員,也可以使用預先定義的版面配置管理員。 RecyclerView
提供下列預先定義的版面配置管理員:
LinearLayoutManager
– 排列可以垂直捲動的數據行中的專案,或在可水平捲動的數據列中排列專案。GridLayoutManager
– 在方格中顯示專案。StaggeredGridLayoutManager
– 在交錯的網格線中顯示專案,其中有些專案有不同的高度和寬度。
若要指定版面配置管理員,請具現化您選擇的版面配置管理員,並將其傳遞至 SetLayoutManager
方法。 請注意,您必須指定配置管理員 – RecyclerView
預設不會選取預先定義的版面配置管理員。
如需配置管理員的詳細資訊,請參閱 RecyclerView.LayoutManager 類別參考。
檢視持有人
檢視持有者是用於快取檢視參考的類別。 配接器會使用這些檢視參考,將每個檢視系結至其內容。 中的每個 RecyclerView
專案都有相關聯的檢視持有者實例,可快取該專案的檢視參考。 若要建立檢視持有者,請使用下列步驟來定義類別,以保存每個項目的確切檢視集:
- 子類別
RecyclerView.ViewHolder
。 - 實作查詢及儲存檢視參考的建構函式。
- 實作配接器可用來存取這些參考的屬性。
基本回收工具View 範例中會顯示實作ViewHolder
的詳細範例。
如需 的詳細資訊 RecyclerView.ViewHolder
,請參閱 RecyclerView.ViewHolder 類別參考。
配接器
大部分整合程序代碼的 RecyclerView
「繁重」都會發生在配接器中。 RecyclerView
您必須提供衍生自 RecyclerView.Adapter
的配接器,以存取數據源,並使用數據源的內容填入每個專案。
因為資料來源是應用程式特定的,您必須實作可瞭解如何存取數據的配接器功能。 配接器會從數據源擷取資訊,並將其載入集合中的每個 RecyclerView
專案。
下圖說明配接器如何透過檢視持有者將數據源中的內容對應至 中每個數據列專案 RecyclerView
內的個別檢視:
配接器會載入每個 RecyclerView
數據列,其中包含特定數據列項目的數據。 例如,若為數據列位置 P,配接器會在數據源內的位置 P 找到相關聯的數據,並將此數據複製到集合中RecyclerView
位於 P 位置的數據列專案。
例如,在上述繪圖中,配接器會使用檢視持有者來查閱 和 TextView
的參考ImageView
,因此當使用者卷動集合並重複使用檢視時,不需要重複呼叫FindViewById
這些檢視。
當您實作配接器時,必須覆寫下列 RecyclerView.Adapter
方法:
OnCreateViewHolder
– 具現化專案配置檔案和檢視持有者。OnBindViewHolder
– 將位於指定位置的數據載入至參考儲存在指定檢視持有者中的檢視中。ItemCount
– 傳回數據源中的項目數。
配置管理員會在將專案放置在 內 RecyclerView
時呼叫這些方法。
通知回收工具檢視數據變更
RecyclerView
當數據源的內容變更時,不會自動更新其顯示;配接器必須在數據集中有變更時通知 RecyclerView
。 數據集可以透過許多方式變更;例如,專案內的內容可以變更,或可能會改變數據的整體結構。
RecyclerView.Adapter
提供許多方法,您可以呼叫, RecyclerView
以最有效率的方式響應數據變更:
NotifyItemChanged
– 表示位於指定位置的項目已變更。NotifyItemRangeChanged
– 表示指定位置範圍中的項目已變更。NotifyItemInserted
– 表示已新插入指定位置的專案。NotifyItemRangeInserted
– 表示已新插入指定位置範圍中的專案。NotifyItemRemoved
– 已移除指定位置的項目訊號。NotifyItemRangeRemoved
– 已移除指定位置範圍中的項目訊號。NotifyDataSetChanged
– 表示數據集已變更的訊號(強制完整更新)。
如果您確切知道數據集的變更方式,您可以呼叫上述適當的方法來以最有效率的方式重新整理 RecyclerView
。 如果您不知道數據集的變更方式,您可以呼叫 NotifyDataSetChanged
,這效率要低得多,因為 RecyclerView
必須重新整理使用者可以看到的所有檢視。 如需這些方法的詳細資訊,請參閱 RecyclerView.Adapter。
在下一個主題中, 會實作一個範例應用程式,以示範上述元件和功能的實際程式代碼範例。