RecyclerView の高度なカスタマイズ Android Jetpack の一部。

特定のニーズに合わせて 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 を作成します。

    選択されたアイテムの特定に使用できるキーのタイプには、Parcelable(および Uri などのすべてのサブクラス)、StringLong の 3 つがあります。選択キーのタイプについて詳しくは、SelectionTracker.Builder をご覧ください。

  2. ItemDetailsLookup を実装します。
  3. ItemDetailsLookup を実装すると、MotionEvent が発生した場合に、RecyclerView アイテムに関する情報に選択ライブラリからアクセスできるようになります。これは実質的に、RecyclerView.ViewHolder インスタンスによってバックアップされる(またはこのインスタンスから抽出される)、ItemDetails インスタンスのファクトリです。

  4. RecyclerView のアイテムの Views を更新し、ユーザーがそのビューを選択または選択解除したことを反映します。

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

  5. ActionMode を使用して、選択されたアイテムに対するアクションを実行するツールをユーザーに提供します。
  6. 選択が変更されたときに通知を受け取るには、SelectionTracker.SelectionObserver を登録します。アイテムが初めて選択されたときに、ActionMode を開始してユーザーにそのことを示し、選択に固有のアクションを提供します。たとえば、削除ボタンを ActionMode バーに追加したり、そのバー上の戻る矢印を選択解除に関連付けたりすることができます。何も選択されていない場合(ユーザーが選択を解除した場合)、忘れずに ActionMode を終了してください。

  7. 解釈されたセカンダリ アクションを実行します。
  8. イベント処理パイプラインの最後に、ライブラリが、ユーザーがアイテムをタップして有効にしようとしている、あるいは、ユーザーが選択したアイテムをドラッグ&ドロップしようとしていると判断することがあります。こうした解釈に対応するには、適切なリスナーを登録します。詳しくは、SelectionTracker.Builder をご覧ください。

  9. SelectionTracker.Builder を使用してすべての要素を組み立てます。
  10. 次の例は、Long 選択キーを使用して各要素を組み立てる方法を示しています。

    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.AdapterSelectionTracker.Builder に指定する必要があります。そのためほとんどの場合、RecyclerView.Adapter の作成後に、SelectionTracker インスタンスが作成され次第、それを RecyclerView.Adapter に追加する必要があります。そうしないと、アイテムの選択状態を onBindViewHolder() メソッドで確認できなくなります。

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

    参考情報

    RecyclerViewSunflower デモアプリで使用されています。