動的リストをカスタマイズする   Android Jetpack の一部。

Compose をお試しください
Jetpack Compose は、Android で推奨される UI ツールキットです。Compose でレイアウトを操作する方法をご確認ください。

RecyclerView オブジェクトは、特定のニーズに合わせてカスタマイズできます。RecyclerView でダイナミックリストを作成するで説明した標準のクラスには、ほとんどのデベロッパーが必要とする機能がすべて用意されています。多くの場合、必要なカスタマイズは、各ビューホルダーのビューを設計し、それらのビューを適切なデータで更新するコードを記述することだけです。ただし、アプリに 固有の要件がある場合は、標準の動作をさまざまな方法で変更できます。 このドキュメントでは、カスタマイズの例をいくつか紹介します。

レイアウトを変更する

RecyclerView は、レイアウトマネージャーを使用して個々の アイテムを画面上に配置します。また、ユーザーに表示されなくなったアイテムビューを再利用するタイミングを判断します。ビューを再利用(リサイクル)するために、レイアウト マネージャーはアダプターに、ビューの内容をデータセットの 別の要素に置き換えるよう求めることがあります。このようにビューをリサイクルすると、不要なビューの作成や、コストのかかる findViewById() 検索を回避できるため、パフォーマンスが向上します。Android サポート ライブラリには 3 つの標準レイアウトマネージャーが含まれており、 それぞれに各種のカスタマイズ オプションが用意されています。

  • LinearLayoutManager: 1 次元のリスト内にアイテムを配置します。 を使用すると、RecyclerViewLinearLayoutManager を使用すると、 レイアウトのような機能が提供されます。ListView
  • GridLayoutManager: 2 次元のグリッド( チェスのボード上の正方形に似ています)内にアイテムを配置します。RecyclerViewGridLayoutManager を使用すると、 GridView レイアウトのような機能が提供されます。
  • StaggeredGridLayoutManager: 各列がその前の列と少しずれている 2 次元のグリッド(アメリカ国旗の星に似ています)内にアイテムを配置します。

これらのレイアウト マネージャーがニーズに合わない場合は、 を RecyclerView.LayoutManager 拡張して独自のレイアウト マネージャーを作成できます。

アイテム アニメーションを追加する

アイテムが変更されるたびに、RecyclerViewアニメーター を使用してその外観を変更します。このアニメーターは、抽象 RecyclerView.ItemAnimator クラスを拡張するオブジェクトです。デフォルトでは、RecyclerViewDefaultItemAnimator を使用してアニメーションを提供します。カスタムのアニメーションを表示したい場合は、 を拡張することによって独自のアニメーター オブジェクトを 定義できます。RecyclerView.ItemAnimator

リストアイテムを選択できるようにする

recyclerview-selection ライブラリを使用すると、ユーザーがタップ またはマウス入力でRecyclerViewリスト内のアイテムを選択できるようになります。これにより、 選択されたアイテムの視覚的な表示に対するコントロールを維持できます。また、選択の動作を管理するポリシー(選択の対象になり得るアイテム、選択可能なアイテムの数など)に対するコントロールも維持できます。

RecyclerView インスタンスに選択のサポートを追加する手順は次のとおりです。

  1. 使用する選択キーのタイプを決定し、 ItemKeyProvider を作成します。

    選択したアイテムを識別するために使用できるキータイプは次の 3 つです。

    選択キーのタイプについて詳しくは、 SelectionTracker.Builder をご覧ください。

  2. を実装します。ItemDetailsLookup
  3. ItemDetailsLookup を使用すると、選択ライブラリは RecyclerView アイテムに関する情報に MotionEvent が指定されたアクセスできます。これは、 ItemDetails インスタンスによってバックアップまたは抽出された RecyclerView.ViewHolder インスタンスのファクトリです。

  4. ユーザーがアイテムを選択したか選択解除したかを反映するように、アイテム View オブジェクトを RecyclerView 内で更新します。

    選択ライブラリでは、 選択したアイテムのデフォルトの視覚的な装飾は提供されません。`onBindViewHolder()` を実装するときに、これを提供します。onBindViewHolder()次のアプローチをおすすめします。

    • onBindViewHolder() で、アイテムが選択されているかどうかに応じて、true または false を指定して View オブジェクトに対して setActivated() ではなく not setSelected() を呼び出します。
    • ビューのスタイルを更新し、有効なステータスを表示します。スタイルの設定には、カラー状態リストのリソースを使用することをおすすめします。
  5. ActionMode を使用して、選択に対してアクションを実行するためのツールをユーザーに提供します。
  6. 選択が変更されたときに通知されるように、 SelectionTracker.SelectionObserver を登録します。選択が最初に作成されたら、 ActionModeを開始してユーザーに提示し、 選択固有のアクションを提供します。たとえば、 ActionModeバーに削除ボタンを追加し、バーの戻る矢印を接続して選択をクリアできます。選択が空になった場合(ユーザーが最後に選択をクリアした場合)、アクションモードを終了します。

  7. 解釈された二次アクションを実行します。
  8. イベント処理パイプラインの最後に、ライブラリが ユーザーがアイテムをタップして有効にしようとしている、あるいは ユーザーが選択したアイテムをドラッグしようとしていると判断することがあります。こうした 解釈に対応するには、適切なリスナーを登録します。詳しくは、SelectionTracker.Builder をご覧ください。

  9. SelectionTracker.Builder を使用してすべてを組み立てます。
  10. 次の例は、これらの要素を組み合わせる方法を示しています。

    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();
        

    インスタンスを作成するには、アプリで RecyclerView の初期化に使用するのと同じ RecyclerView.AdapterSelectionTracker.Builder に提供する必要があります。SelectionTrackerこのため、 SelectionTracker インスタンスを作成したら、 RecyclerView.Adapter に挿入します。そうしないと、アイテムの 選択状態をonBindViewHolder() メソッドから確認できません。

  11. アクティビティの ライフサイクル イベントに選択を含めます。
  12. 選択状態をアクティビティのライフサイクル イベント間で保持するには、アプリで選択トラッカーのonSaveInstanceState()onRestoreInstanceState() メソッドをアクティビティのonSaveInstanceState()onRestoreInstanceState() メソッドからそれぞれ呼び出す必要があります。アプリでは、一意の選択 ID を SelectionTracker.Builder コンストラクタに提供する必要もあります。この ID は必須です。なぜなら、アクティビティやフラグメントに選択可能なリストが複数ある場合は、それらすべてを保存された状態に維持する必要があるためです。

参考情報

詳細については、次のリファレンスをご覧ください。