動的リストをカスタマイズする 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など)StringLong
選択キーのタイプについて詳しくは、
SelectionTracker.Builderをご覧ください。 ItemDetailsLookupを実装します。RecyclerViewのアイテムViewオブジェクトを更新し、ユーザーがそれらを選択または選択解除したかどうかを反映します。選択ライブラリには、選択されたアイテムに対するデフォルトの視覚的装飾は用意されていません。
onBindViewHolder()を実装する場合は、視覚的装飾を用意する必要があります。次のアプローチをおすすめします。onBindViewHolder()で、ViewオブジェクトのsetActivated()(setSelected()ではない)を、アイテムが選択されているかどうかに応じてtrueまたはfalseを指定して呼び出します。- ビューのスタイルを更新し、有効なステータスを表示します。スタイルの設定には、カラー状態リストのリソースを使用することをおすすめします。
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 を初期化するために使用したのと同じ RecyclerView.Adapter を SelectionTracker.Builder に指定する必要があります。そのため、SelectionTracker インスタンスを作成したら、それを RecyclerView.Adapter に挿入します。そうしないと、アイテムの選択状態を onBindViewHolder() メソッドで確認できなくなります。
選択状態をアクティビティのライフサイクル イベント間で保持するには、アプリで選択トラッカーの onSaveInstanceState() メソッドと onRestoreInstanceState() メソッドをアクティビティの onSaveInstanceState() メソッドと onRestoreInstanceState() メソッドからそれぞれ呼び出す必要があります。アプリでは、一意の選択 ID を SelectionTracker.Builder コンストラクタに提供する必要もあります。この ID は必須です。なぜなら、アクティビティやフラグメントに選択可能なリストが複数ある場合は、それらすべてを保存された状態に維持する必要があるためです。
参考情報
詳細については、以下のリファレンスをご覧ください。
- Sunflower デモアプリ:
RecyclerViewを使用しています。 - RecyclerView を使ってスクロール可能なリストを表示する Codelab。
- Android Kotlin の基礎: RecyclerView の基礎のコードラボ。