動的リストをカスタマイズする   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() で、View オブジェクトの setActivated()setSelected() ではない)を、アイテムが選択されているかどうかに応じて true または false を指定して呼び出します。
    • ビューのスタイルを更新し、有効なステータスを表示します。スタイルの設定には、カラー状態リストのリソースを使用することをおすすめします。
  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 は必須です。なぜなら、アクティビティやフラグメントに選択可能なリストが複数ある場合は、それらすべてを保存された状態に維持する必要があるためです。

参考情報

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