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

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

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

    • onBindViewHolder() 内で、アイテムが選択されているかどうかに応じて、true または false を使用して、View オブジェクトで setActivated() を呼び出します(setSelected() ではありません)。
    • ビューのスタイルを更新し、有効なステータスを表示します。スタイルの設定には、カラー状態リストのリソースを使用することをおすすめします。
  5. ActionMode を使用して、選択されたアイテムに対するアクションを実行するツールをユーザーに提供します。
  6. 選択が変更されたときに通知を受け取るには、SelectionTracker.SelectionObserver を登録します。アイテムが初めて選択されたときに、ActionMode を開始してユーザーにそのことを示し、選択に固有のアクションを提供します。たとえば、削除ボタンを 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 インスタンスを作成するには、アプリで RecyclerViewSelectionTracker.Builder に初期化するために使用したのと同じ RecyclerView.Adapter を指定する必要があります。そのため、SelectionTracker インスタンスを作成したら、RecyclerView.Adapter に挿入します。そうしないと、アイテムの選択状態を onBindViewHolder() メソッドで確認できなくなります。

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

参考情報

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