動的リストをカスタマイズする 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. ライブラリは、イベント処理パイプラインの最後に、ユーザーがアイテムをタップまたは選択したアイテムをドラッグしてアクティブにしようとしていると判断する場合があります。こうした解釈に対応するには、適切なリスナーを登録します。詳細については、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 が必要なのは、アクティビティまたはフラグメントに選択可能な個別のリストが複数存在する場合があり、それらのリストはすべて保存済み状態に維持する必要があるためです。

参考情報

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