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