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