動的リストをカスタマイズする Android Jetpack の一部。
特定のニーズに合わせて RecyclerView
オブジェクトをカスタマイズできます。RecyclerView で動的リストを作成するで説明されている標準クラスは、ほとんどのデベロッパーが必要とする機能をすべて備えています。多くの場合、ビューホルダーごとにビューを設計し、適切なデータでビューを更新するコードを記述するだけで済みます。ただし、アプリに特定の要件がある場合は、標準の動作をさまざまな方法で変更できます。このドキュメントでは、可能なカスタマイズについて説明します。
レイアウトを変更する
RecyclerView
は、レイアウト マネージャーを使用して画面上の個々のアイテムを配置し、ユーザーに表示されなくなったアイテムビューを再利用するタイミングを決定します。ビューを再利用(つまりリサイクル)するために、レイアウト マネージャーがアダプターに対して、ビューの内容をデータセットとは異なる要素に置き換えるよう要求する場合があります。この方法でビューをリサイクルすると、不要なビューの作成や高コストの findViewById()
ルックアップが回避されるため、パフォーマンスが向上します。Android サポート ライブラリには、3 つの標準レイアウト マネージャーが含まれており、それぞれに多くのカスタマイズ オプションが用意されています。
LinearLayoutManager
: アイテムを 1 次元のリストに配置します。RecyclerView
をLinearLayoutManager
で使用すると、ListView
レイアウトのような機能が提供されます。GridLayoutManager
: チェッカーボード上の正方形のように、2 次元のグリッド内にアイテムを配置します。RecyclerView
をGridLayoutManager
で使用すると、GridView
レイアウトのような機能が提供されます。StaggeredGridLayoutManager
: アメリカ国旗の星のように、各列が前の列からわずかにずらして、2 次元のグリッドにアイテムを配置します。
これらのレイアウト マネージャーがニーズに合わない場合は、RecyclerView.LayoutManager
抽象クラスを拡張して独自のレイアウト マネージャーを作成できます。
アイテム アニメーションを追加する
アイテムが変更されるたびに、RecyclerView
はアニメーターを使用してその外観を変更します。このアニメーターは、抽象 RecyclerView.ItemAnimator
クラスを拡張するオブジェクトです。デフォルトでは、RecyclerView
は DefaultItemAnimator
を使用してアニメーションを提供します。カスタム アニメーションを提供する場合は、RecyclerView.ItemAnimator
を拡張して独自のアニメーター オブジェクトを定義できます。
リストアイテムを選択できるようにする
recyclerview-selection
ライブラリを使用すると、ユーザーはタップ入力またはマウス入力を使用して RecyclerView
リスト内のアイテムを選択できます。これにより、選択したアイテムの見た目をコントロールできます。また、選択可能なアイテムや選択可能なアイテム数など、選択動作を制御するポリシーも制御できます。
RecyclerView
インスタンスに選択サポートを追加する手順は次のとおりです。
- 使用する選択キーのタイプを決定して、
ItemKeyProvider
を作成します。選択したアイテムを識別するために使用できるキータイプは 3 つあります。
Parcelable
とそのサブクラス(Uri
など)String
Long
選択キーのタイプについて詳しくは、
SelectionTracker.Builder
をご覧ください。 ItemDetailsLookup
を実装します。RecyclerView
内のアイテムView
オブジェクトを更新して、ユーザーがそれらを選択または選択解除したかどうかを反映します。選択ライブラリには、選択されたアイテムのデフォルトの視覚的装飾は用意されていません。
onBindViewHolder()
を実装するときに指定します。次の方法をおすすめします。onBindViewHolder()
内で、アイテムが選択されているかどうかに応じて、true
またはfalse
を使用して、View
オブジェクトでsetActivated()
を呼び出します(setSelected()
ではありません)。- ビューのスタイルを更新し、有効なステータスを表示します。カラー状態リストリソースを使用してスタイルを構成することをおすすめします。
ActionMode
を使用して、選択項目に対してアクションを実行するためのツールをユーザーに提供します。- 解釈されたセカンダリ アクションを実行します。
SelectionTracker.Builder
ですべてを組み立てます。- アクティビティのライフサイクル イベントに選択を含めます。
ItemDetailsLookup
により、選択ライブラリは、MotionEvent
で指定された RecyclerView
アイテムに関する情報にアクセスできます。これは、実質的には、
ItemDetails
インスタンスによってバックアップされる、または
RecyclerView.ViewHolder
インスタンスから抽出されるインスタンスの
ファクトリです。
SelectionTracker.SelectionObserver
を登録して、選択内容が変更されたときに通知されるようにします。選択が最初に作成されたら、ActionMode
を開始してユーザーにこれを表示し、選択固有のアクションを提供します。たとえば、ActionMode
バーに削除ボタンを追加し、バー上の戻る矢印を接続して選択をクリアできます。選択内容が空になったら(ユーザーが最後に選択をクリアした場合)、アクション モードを終了します。
イベント処理パイプラインの最後で、ライブラリは、ユーザーがアイテムをアクティブにしようとしている、タップすることでアイテムをアクティブにしようとしている、または 1 つまたは複数のアイテムを選択してドラッグしようとしていると判断することがあります。こうした解釈に対応するには、適切なリスナーを登録します。詳細については、SelectionTracker.Builder
をご覧ください。
次の例は、これらの要素をまとめる方法を示しています。
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
を SelectionTracker.Builder
に初期化する場合に使用するのと同じ RecyclerView.Adapter
をアプリで指定する必要があります。このため、SelectionTracker
インスタンスを作成した後、それを RecyclerView.Adapter
に挿入します。そうしないと、アイテムの選択済みのステータスを onBindViewHolder()
メソッドから確認できません。
アクティビティのライフサイクル イベント全体で選択状態を保持するには、アプリでアクティビティの onSaveInstanceState()
メソッドと onRestoreInstanceState()
メソッドから、選択トラッカーの onSaveInstanceState()
メソッドと onRestoreInstanceState()
メソッドをそれぞれ呼び出す必要があります。また、アプリで一意の選択 ID を SelectionTracker.Builder
コンストラクタに指定する必要があります。この ID が必要なのは、アクティビティまたはフラグメントに、選択可能な複数のリストがあり、そのすべてを保存済み状態で保持する必要があるためです。
参考情報
詳細については、次のリファレンスをご覧ください。
- Sunflower デモアプリ。
RecyclerView
を使用します。 - Codelab の RecyclerView を使用してスクロール可能なリストを表示する。
- Android Kotlin の基礎: RecyclerView の基礎 Codelab