Android Kotlin基礎講座 07.5:RecyclerViewのヘッダー

概念:RecyclerViewにおけるヘッダー

この記事では、一つのRecyclerView内で異なるレイアウトを使っているアイテムを含ませることの一般原則を解説します。一般的な例としては、リストやグリッド内にヘッダーを持たせる場合などです。リストにはそれが含んでいるアイテムを説明するためのヘッダーを一つ持たせることができます。また、一つのリスト内でもグループや分離されたアイテムに対しては複数のヘッダーを持つこともできます。

RecyclerViewにはそれぞれのアイテムが持つレイアウトのデータや型に関する情報は一切含まれていません。LayoutManagerがアイテムを画面上に配置しますが、アダプターがデータを表示できるように適合させ、ビューホルダーをRecyclerViewに渡します。従って、ヘッダーを作成するためのコードはアダプターに追加します。

ヘッダーを追加する二つの方法

RecyclerViewにおいて、リスト内のそれぞれのアイテムは0から始まるインデックスナンバーに対応しています。

[実際のデータ] -> [アダプタービュー]

[0: SleepNight] -> [0: SleepNight] [1: SleepNight] -> [1: SleepNight] [2: SleepNight] -> [2: SleepNight]

リストにヘッダーを追加する方法の一つはアダプターを修正して、ヘッダーがどこに表示される必要があるのかをインデックスで確認し、異なるViewHolderを使わせるようにする方法です。

Adapterはヘッダーに関する情報をトラックする役割を持ちます。例として、表のトップにヘッダーを表示するためには、0のインデックスナンバーをもつアイテムを表示する際に、ヘッダー用の異なるViewHolderを返してあげる必要があります。その後、以下のように、他のアイテム全てをヘッダー分ずらして表示します。

[実際のデータ] -> [アダプタービュー]

[0: ヘッダー]

[0: SleepNight] -> [1: SleepNight] [1: SleepNight] -> [2: SleepNight] [2: SleepNight] -> [3: SleepNight]

ヘッダーを追加するもう一つの方法は、データグリッドのバッキングデータセットを変更する方法です。表示される必要があるデータは全てリストに保存されているため、リストにヘッダーを表すアイテムを含ませるように変更することができます。これは少し理解はしやすいのですが、オブジェクトをどのように設計するかを考える必要があるため、様々なアイテムのタイプが一つのリストに入り混じります。この方法で実装すると、アダプターが渡されたアイテムを表示します。したがって、0に位置するアイテムはヘッダーで、1はSleepNightになります。画面に表示されているものに直接つながっています。

[実際のデータ] -> [アダプタービュー]

[0: ヘッダー] -> [0: ヘッダー]

[1: SleepNight] -> [1: SleepNight] [2: SleepNight] -> [2: SleepNight] [3: SleepNight] -> [3: SleepNight]

それぞれの方法論には、利点と欠点があります。データセットを変更する方法はアダプターのコードをあまり変更する必要がなく、データのリストを操作することでヘッダーロジックを追加することができます。一方で、ヘッダー用のインデックスを確認することで異なるViewHolderをを使う方法は、ヘッダーのレイアウトの自由性が向上します。またバッキングデータを変更しないで、アダプターがデータをビューに適合するように扱うことができます。

この記事では、RecyclerViewを更新して、リストのはじめにヘッダーを表示するようにします。今回はヘッダー用に別のViewHolderを使わせるやり方で実装していきます。アプリはどのViewHolderを使うかを決定するためにリストのインデックスを確認します。