自訂進階 RecyclerViewAndroid Jetpack 的一部分

您可以依據特定需求自訂 RecyclerView 物件。使用 RecyclerView 建立動態清單中介紹的標準類別提供了大部分開發人員需要的所有功能;在許多情況下,您需要執行的唯一自訂作業,就是為每個檢視區塊擁有者設計檢視區塊,然後撰寫程式碼來使用適當的資料更新這些檢視區塊。不過,如果您的應用程式有特定要求,則可以透過多種方式修改標準行為。本頁面說明可能進行的其他自訂項目。

修改版面配置

RecyclerView 會使用版面配置管理員確定個別項目在螢幕上的擺放位置,並決定何時重複使用對使用者不再顯示的項目檢視區塊。如要重複使用 (或回收利用) 檢視區塊,版面配置管理員可能會要求調整器將檢視區塊的內容替換成資料集中的另一元素。以這種方式回收利用檢視區塊,能夠避免建立不必要的檢視區塊或執行昂貴的 findViewById() 查詢,從而能夠提升效能。Android 支援資料庫包含三個標準版面配置管理員,每個管理員都提供多個自訂選項:

如果上述版面配置管理員都不符合您的需求,則可以擴充 RecyclerView.LayoutManager 抽象類別,建立自己的版面配置管理員。

新增項目動畫

當項目變更時,RecyclerView 會使用動畫工具來變更其外觀。這個動畫工具是可擴充抽象 RecyclerView.ItemAnimator 類別的物件。根據預設,RecyclerView 會使用 DefaultItemAnimator 提供動畫。如果您想提供自訂動畫,則可以擴充 RecyclerView.ItemAnimator 來定義自己的動畫工具物件。

啟用清單項目選取內容

recyclerview-selection 程式庫讓使用者可透過輕觸或滑鼠輸入的方式選取 RecyclerView 清單中的項目。您可以控管所選項目的視覺呈現方式,也可以控管用來控制選取行為的政策,例如能夠選取的項目以及可選取的項目數。

如要向 RecyclerView 例項新增選取支援,請按照以下步驟操作:

  1. 確定要使用的選取索引鍵類型,然後建構 ItemKeyProvider

    您可以使用三種索引鍵類型來識別所選項目:Parcelable (以及所有子類別,如 Uri)、StringLong。如要進一步瞭解選取索引鍵類型,請參閱 SelectionTracker.Builder

  2. 實作 ItemDetailsLookup
  3. ItemDetailsLookup 讓選取程式庫能夠存取提供 MotionEventRecyclerView 項目相關資訊。這實際上是 ItemDetails 例項的工廠,這些例項由 RecyclerView.ViewHolder 例項備份 (或從中擷取而來)。

  4. 更新 RecyclerView 中的項目 Views,以反映使用者已選取或取消選取該項目。

    選取程式庫不會為選定項目提供預設視覺呈現風格。您必須在實作 onBindViewHolder() 時提供這項資訊。我們推薦以下方法:

  5. 使用 ActionMode 為使用者提供可對選取內容執行動作的工具。
  6. 註冊 SelectionTracker.SelectionObserver,以便在選取內容變更時收到通知。首次建立選取內容時,啟動 ActionMode 以將其呈現給使用者,並提供特定於選取內容的動作。例如,您可以在 ActionMode 列中新增刪除按鈕,並將列上的返回箭頭連線到清除選取內容。如果選取內容變為空白 (使用者最後一次清除選取內容),則務必終止動作模式。

  7. 執行已解讀的次要動作
  8. 在事件處理管道結束時,程式庫可能會判定使用者正在嘗試透過輕觸項目來啟動項目,還是嘗試拖曳一個項目或一組所選項目。註冊適當的事件監聽器來回應這些解釋。詳情請參閱 SelectionTracker.Builder

  9. 使用 SelectionTracker.Builder 組合所有內容
  10. 以下範例說明如何使用 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() 方法查看該項目的所選狀態。

  11. 將選取內容加入活動生命週期事件中。
  12. 如要在活動生命週期事件中保留選取狀態,應用程式必須分別從活動的 onSaveInstanceState()onRestoreInstanceState() 方法,呼叫選取追蹤工具的 onSaveInstanceState()onRestoreInstanceState() 方法。您的應用程式還必須向 SelectionTracker.Builder 建構函式提供專屬的選取 ID。由於活動或片段可能擁有多個不同的可選取清單,所有這些清單都需要保持儲存狀態,因此需要提供這一 ID。

    其他資源

    RecyclerView 用於 Sunflower 示範應用程式。