自訂進階 RecyclerViewAndroid 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
中的項目Views
,以反映使用者已選取或取消選取該項目。選取程式庫不會為選定項目提供預設視覺呈現風格。您必須在實作
onBindViewHolder()
時提供這項資訊。我們推薦以下方法:- 在
onBindViewHolder()
中,使用true
或false
(視所選項目而定) 在View
物件上呼叫setActivated()
(而非setSelected()
)。 - 更新檢視區塊的樣式來代表已啟用狀態。建議使用色彩狀態清單資源來設定樣式。
- 在
- 使用
ActionMode
為使用者提供可對選取內容執行動作的工具。 - 執行已解讀的次要動作
- 使用
SelectionTracker.Builder
組合所有內容 - 將選取內容加入活動生命週期事件中。
ItemDetailsLookup
讓選取程式庫能夠存取提供 MotionEvent
的 RecyclerView
項目相關資訊。這實際上是 ItemDetails
例項的工廠,這些例項由 RecyclerView.ViewHolder
例項備份 (或從中擷取而來)。
註冊 SelectionTracker.SelectionObserver
,以便在選取內容變更時收到通知。首次建立選取內容時,啟動 ActionMode
以將其呈現給使用者,並提供特定於選取內容的動作。例如,您可以在 ActionMode
列中新增刪除按鈕,並將列上的返回箭頭連線到清除選取內容。如果選取內容變為空白 (使用者最後一次清除選取內容),則務必終止動作模式。
在事件處理管道結束時,程式庫可能會判定使用者正在嘗試透過輕觸項目來啟動項目,還是嘗試拖曳一個項目或一組所選項目。註冊適當的事件監聽器來回應這些解釋。詳情請參閱 SelectionTracker.Builder
。
以下範例說明如何使用 Long
選取索引鍵來將所有這些內容放置在一起:
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.Adapter
,必須與用於將 RecyclerView
初始化為 SelectionTracker.Builder
的工具相同。因此,在建立 SelectionTracker
例項以及建立 RecyclerView.Adapter
後,您很可能需要將該例項插入 RecyclerView.Adapter
。否則,您將無法使用 onBindViewHolder()
方法查看該項目的所選狀態。
如要在活動生命週期事件中保留選取狀態,應用程式必須分別從活動的 onSaveInstanceState()
和 onRestoreInstanceState()
方法,呼叫選取追蹤工具的 onSaveInstanceState()
和 onRestoreInstanceState()
方法。您的應用程式還必須向 SelectionTracker.Builder
建構函式提供專屬的選取 ID。由於活動或片段可能擁有多個不同的可選取清單,所有這些清單都需要保持儲存狀態,因此需要提供這一 ID。
其他資源
RecyclerView
用於 Sunflower 示範應用程式。