自訂動態清單 Android Jetpack 的一部分。
您可以依據特定需求自訂 RecyclerView
物件。「使用 RecyclerView 建立動態清單」一文所述的標準類別提供大多數開發人員需要的所有功能。在許多情況下,您只需為每個檢視畫面持有者設計檢視畫面,然後編寫程式碼,即可使用合適的資料更新這些檢視畫面。不過,如果您的應用程式有特定需求,可以透過多種方式修改標準行為。本文件會說明可供自訂的部分。
修改版面配置
RecyclerView
會使用版面配置管理工具,決定個別項目在螢幕上的位置,並決定何時重複使用使用者不再看到的項目檢視畫面。如要重複使用或「回收」檢視畫面,版面配置管理員可能會要求轉接程式將檢視畫面的內容替換為資料集中的其他元素。以這種方式回收檢視畫面,可避免建立不必要的檢視畫面或執行昂貴的 findViewById()
查詢,藉此提升效能。Android 支援資料庫包含三個標準版面配置管理工具,其中提供許多自訂選項:
LinearLayoutManager
:以單維度清單排列項目。將RecyclerView
與LinearLayoutManager
搭配使用可提供ListView
版面配置等功能。GridLayoutManager
:以二維格線排列項目,例如棋盤上的正方形。將RecyclerView
與GridLayoutManager
搭配使用,可提供GridView
版面配置等功能。StaggeredGridLayoutManager
:以二維格線排列項目,每欄與前一個欄略有偏移,例如美國國旗的星星。
如果這些版面配置管理工具不符合需求,您可以擴充 RecyclerView.LayoutManager
抽象類別,自行建立。
新增項目動畫
每當項目變更時,RecyclerView
就會使用動畫工具變更其外觀。這個動畫工具是擴充抽象 RecyclerView.ItemAnimator
類別的物件。根據預設,RecyclerView
會使用 DefaultItemAnimator
提供動畫。如要提供自訂動畫,可以擴充 RecyclerView.ItemAnimator
來定義自己的動畫工具物件。
啟用清單項目選取內容
recyclerview-selection
程式庫可讓使用者透過觸控或滑鼠輸入,選取 RecyclerView
清單中的項目。這可讓您控管所選項目的視覺呈現方式。您也可以保留用來控制選取行為的政策,例如:哪些項目符合選取條件,以及可選取的項目數量。
如要在 RecyclerView
執行個體中新增選取支援,請按照下列步驟操作:
- 決定要使用的選取金鑰類型,然後建構
ItemKeyProvider
。有三種主要類型可以用來識別所選項目:
Parcelable
及其子類別,例如Uri
String
Long
如要進一步瞭解選取鍵類型,請參閱
SelectionTracker.Builder
。 - 實作
ItemDetailsLookup
。 - 更新
RecyclerView
中的項目View
物件,以反映使用者是否已選取或取消選取這些物件。選取程式庫不會為所選項目提供預設視覺裝飾。請在實作
onBindViewHolder()
時提供此項目。建議您採取以下做法:- 在
onBindViewHolder()
中,利用true
或false
在View
物件上呼叫setActivated()
,而「不是」setSelected()
(視已選取項目而定)。 - 更新檢視區塊的樣式來代表已啟用狀態。建議使用顏色狀態清單資源來設定樣式。
- 在
- 使用
ActionMode
為使用者提供可對選取內容執行動作的工具。 - 執行任何已解讀的次要動作。
- 使用
SelectionTracker.Builder
組合所有內容。 - 請在活動生命週期事件中加入選取項目。
ItemDetailsLookup
可讓選取程式庫存取指定 MotionEvent
的 RecyclerView
項目相關資訊。實際上,這是由 RecyclerView.ViewHolder
執行個體備份或擷取的 ItemDetails
執行個體的工廠。
註冊 SelectionTracker.SelectionObserver
,即可在選取項目變更時收到通知。首次建立選取項目後,請啟動 ActionMode
向使用者展示這個畫面,並提供選項專屬的動作。舉例來說,您可以在 ActionMode
列中新增刪除按鈕,並將長條上的返回箭頭連結清除選取項目。如果選取項目變為空白,如果使用者上次清除所選項目,系統就會終止動作模式。
在事件處理管道結束時,程式庫可能會判斷使用者嘗試以輕觸的方式啟用項目,或是嘗試拖曳一個項目或一組所選項目。註冊適當的事件監聽器來回應這些解釋。詳情請參閱 SelectionTracker.Builder
。
以下範例說明如何將這些元素放在一起:
Kotlin
var tracker = SelectionTracker.Builder( "my-selection-id", recyclerView, StableIdKeyProvider(recyclerView), MyDetailsLookup(recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener(myItemActivatedListener) .build()
Java
SelectionTracker tracker = new SelectionTracker.Builder<>( "my-selection-id", recyclerView, new StableIdKeyProvider(recyclerView), new MyDetailsLookup(recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener(myItemActivatedListener) .build();
如要建構 SelectionTracker
例項,應用程式必須提供您用於將 RecyclerView
初始化為 SelectionTracker.Builder
的相同 RecyclerView.Adapter
。因此,在建立 SelectionTracker
例項後,請將該例項插入 RecyclerView.Adapter
中。否則,您無法從 onBindViewHolder()
方法查看所選項目的選取狀態。
如要在活動生命週期事件間保留選取狀態,應用程式必須分別從活動的 onSaveInstanceState()
和 onRestoreInstanceState()
方法呼叫選取追蹤器的 onSaveInstanceState()
和 onRestoreInstanceState()
方法。應用程式也必須為 SelectionTracker.Builder
建構函式提供專屬的選取 ID。活動或片段可能有多個不同的可選取清單,且這些清單需要保留在儲存狀態中,因此需要提供此 ID。
其他資源
詳情請參閱下列參考資料。
- Sunflower 試用版應用程式使用
RecyclerView
。 - 使用 RecyclerView 顯示可捲動的清單程式碼研究室。
- Android Kotlin 基礎知識:RecyclerView 基礎知識程式碼研究室。