動的リストをカスタマイズする 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 により、選択ライブラリは、MotionEvent で指定された RecyclerView アイテムに関する情報にアクセスできます。これは、実質的には、 ItemDetails インスタンスによってバックアップされる、または RecyclerView.ViewHolder インスタンスから抽出されるインスタンスの ファクトリです。

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

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

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

  7. 解釈されたセカンダリ アクションを実行します。
  8. イベント処理パイプラインの最後で、ライブラリは、ユーザーがアイテムをアクティブにしようとしている、タップすることでアイテムをアクティブにしようとしている、または 1 つまたは複数のアイテムを選択してドラッグしようとしていると判断することがあります。こうした解釈に対応するには、適切なリスナーを登録します。詳細については、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 インスタンスをビルドするには、RecyclerViewSelectionTracker.Builder に初期化する場合に使用するのと同じ RecyclerView.Adapter をアプリで指定する必要があります。このため、SelectionTracker インスタンスを作成した後、それを RecyclerView.Adapter に挿入します。そうしないと、アイテムの選択済みのステータスを onBindViewHolder() メソッドから確認できません。

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

参考情報

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