動的リストをカスタマイズする 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
バーに追加し、バーの戻る矢印を接続して選択をクリアできます。選択内容が空になると(ユーザーが選択を最後にクリアした場合)に、アクション モードを終了します。
ライブラリは、イベント処理パイプラインの最後に、ユーザーがアイテムをタップまたは選択したアイテムをドラッグしてアクティブにしようとしていると判断する場合があります。こうした解釈に対応するには、適切なリスナーを登録します。詳細については、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。