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

Compose をお試しください
Jetpack Compose は、Android で推奨される UI ツールキットです。Compose でレイアウトを操作する方法について学習します。

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

レイアウトを変更する

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

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

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

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

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

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

recyclerview-selection ライブラリを使用すると、ユーザーはタッチ入力またはマウス入力を使用して RecyclerView リスト内のアイテムを選択できます。これにより、選択したアイテムの視覚的な表示を制御できます。また、選択動作を制御するポリシー(選択可能なアイテムや選択可能なアイテム数など)を制御することもできます。

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

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

    選択したアイテムを識別するために使用できるキーには、次の 3 種類があります。

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

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

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

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

    • onBindViewHolder() で、View オブジェクトに対して setActivated()(setSelected() ではない)を呼び出します。このとき、アイテムが選択されているかどうかに応じて、true または false を指定します。
    • ビューのスタイルを更新し、有効なステータスを表示します。スタイル設定を構成するには、カラー状態リストリソースを使用することをおすすめします。
  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();
        

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

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

参考情報

詳しくは、以下のリファレンスをご覧ください。