動的リストをカスタマイズする 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
アイテムに関する情報にアクセスできます。これは実質的に、RecyclerView.ViewHolder
インスタンスによってバックアップされる(またはこのインスタンスから抽出される)、ItemDetails
インスタンスのファクトリです。
選択が変更されたときに通知を受け取るには、SelectionTracker.SelectionObserver
を登録します。アイテムが初めて選択されたときに、ActionMode
を開始してユーザーにそのことを示し、選択に固有のアクションを提供します。たとえば、削除ボタンを 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
を SelectionTracker.Builder
に初期化するために使用したのと同じ RecyclerView.Adapter
を指定する必要があります。そのため、SelectionTracker
インスタンスを作成したら、RecyclerView.Adapter
に挿入します。そうしないと、アイテムの選択状態を onBindViewHolder()
メソッドで確認できなくなります。
アクティビティのライフサイクル イベント全体で選択状態を保持するには、アプリでアクティビティの onSaveInstanceState()
メソッドと onRestoreInstanceState()
メソッドから、選択トラッカーの onSaveInstanceState()
メソッドと onRestoreInstanceState()
メソッドをそれぞれ呼び出す必要があります。アプリでは、一意の選択 ID を SelectionTracker.Builder
コンストラクタに提供する必要もあります。この ID が必要なのは、アクティビティまたはフラグメントに、選択可能な複数のリストがあり、そのすべてを保存済み状態で保持する必要があるためです。
参考情報
詳細については、次のリファレンスをご覧ください。
- Sunflower デモアプリ。
RecyclerView
を使用します。 - RecyclerView を使ってスクロール可能なリストを表示する Codelab。
- Android Kotlin の基礎: RecyclerView の基礎 Codelab。