動的リストをカスタマイズする 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()で、アイテムが選択されているかどうかに応じて、trueまたはfalseを指定してViewオブジェクトに対してsetActivated()ではなく notsetSelected()を呼び出します。- ビューのスタイルを更新し、有効なステータスを表示します。スタイルの設定には、カラー状態リストのリソースを使用することをおすすめします。
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。