RecyclerView の高度なカスタマイズ 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
を作成します。選択されたアイテムの特定に使用できるキーのタイプには、
Parcelable
(およびUri
などのすべてのサブクラス)、String
、Long
の 3 つがあります。選択キーのタイプについて詳しくは、SelectionTracker.Builder
をご覧ください。 ItemDetailsLookup
を実装します。RecyclerView
のアイテムのViews
を更新し、ユーザーがそのビューを選択または選択解除したことを反映します。選択ライブラリには、選択されたアイテムに対するデフォルトの視覚的装飾は用意されていません。
onBindViewHolder()
を実装する場合は、視覚的装飾を用意する必要があります。おすすめの方法は次のとおりです。onBindViewHolder()
で、View
オブジェクトのsetActivated()
(setSelected()
ではない)を、true
またはfalse
(アイテムが選択されているかどうかによって異なる)を指定して呼び出します。- ビューのスタイルを更新し、有効なステータスを表示します。スタイルの設定には、カラー状態リストのリソースを使用することをおすすめします。
ActionMode
を使用して、選択されたアイテムに対するアクションを実行するツールをユーザーに提供します。- 解釈されたセカンダリ アクションを実行します。
SelectionTracker.Builder
を使用してすべての要素を組み立てます。- 選択をアクティビティのライフサイクル イベントに追加します。
ItemDetailsLookup
を実装すると、MotionEvent
が発生した場合に、RecyclerView
アイテムに関する情報に選択ライブラリからアクセスできるようになります。これは実質的に、RecyclerView.ViewHolder
インスタンスによってバックアップされる(またはこのインスタンスから抽出される)、ItemDetails
インスタンスのファクトリです。
選択が変更されたときに通知を受け取るには、SelectionTracker.SelectionObserver
を登録します。アイテムが初めて選択されたときに、ActionMode
を開始してユーザーにそのことを示し、選択に固有のアクションを提供します。たとえば、削除ボタンを ActionMode
バーに追加したり、そのバー上の戻る矢印を選択解除に関連付けたりすることができます。何も選択されていない場合(ユーザーが選択を解除した場合)、忘れずに ActionMode を終了してください。
イベント処理パイプラインの最後に、ライブラリが、ユーザーがアイテムをタップして有効にしようとしている、あるいは、ユーザーが選択したアイテムをドラッグ&ドロップしようとしていると判断することがあります。こうした解釈に対応するには、適切なリスナーを登録します。詳しくは、SelectionTracker.Builder
をご覧ください。
次の例は、Long
選択キーを使用して各要素を組み立てる方法を示しています。
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
に指定する必要があります。そのためほとんどの場合、RecyclerView.Adapter
の作成後に、SelectionTracker
インスタンスが作成され次第、それを RecyclerView.Adapter
に追加する必要があります。そうしないと、アイテムの選択状態を onBindViewHolder()
メソッドで確認できなくなります。
選択状態をアクティビティのライフサイクル イベント間で保持するには、アプリで選択トラッカーの onSaveInstanceState()
メソッドと onRestoreInstanceState()
メソッドをアクティビティの onSaveInstanceState()
メソッドと onRestoreInstanceState()
メソッドからそれぞれ呼び出す必要があります。アプリでは、一意の選択 ID を SelectionTracker.Builder
コンストラクタに提供する必要もあります。この ID は必須です。なぜなら、アクティビティやフラグメントに選択可能なリストが複数ある場合は、それらすべてを保存された状態に維持する必要があるためです。
参考情報
RecyclerView
は Sunflower デモアプリで使用されています。