Android Kotlin の基礎 07.3: RecyclerView を使った GridLayout

この Codelab は、Android Kotlin の基礎コースの一部です。Codelab を順番に進めていくと、このコースを最大限に活用できます。すべてのコース Codelab は Android Kotlin の基礎 Codelab ランディング ページに掲載されています。

はじめに

RecyclerView の主な長所の 1 つは、レイアウト マネージャーを使用してレイアウト戦略を制御、変更できることです。LayoutManager は、RecyclerView 内のアイテムの配置方法を管理します。

RecyclerView には、一般的なユースケースに対応するレイアウト マネージャーが付属しています。たとえば、水平リストと垂直リストには LinearLayout を、グリッドには GridLayout を使用できます。より複雑なユースケースでは、カスタムの LayoutManager を実装する必要があります。

この Codelab では、前の Codelab で作成したスリープ トラッカー アプリを基に、リストではなくグリッド レイアウトを使用してデータを表示する方法について説明します。(前の Codelab のアプリがインストールされていない場合は、この Codelab のスターター コードをダウンロードできます)。

前提となる知識

以下について把握しておく必要があります。

  • ActivityFragmentsViews を使用した基本的なユーザー インターフェースの作成
  • フラグメント間を移動し、safeArgs を使用してフラグメント間でデータを渡す
  • モデル、モデル ファクトリ、変換の表示
  • LiveData とそのオブザーバー
  • Room データベースの作成方法、DAO を作成する方法、エンティティを定義する方法
  • データベース タスクやその他の長時間実行タスクにコルーチンを使用する方法
  • AdapterViewHolder、アイテム レイアウトを持つ基本的な RecyclerView を実装する方法
  • RecyclerView のデータ バインディングの実装方法
  • バインディング アダプターを作成して使用し、データを変換する方法

学習内容

  • 別の LayoutManager を使用して RecyclerView でのデータの表示方法を変更する方法
  • 睡眠データのグリッド レイアウトを作成する方法

演習内容

  • このシリーズの前の Codelab で作成した睡眠トラッカー アプリをビルドします。
  • アプリの RecyclerView に表示される睡眠データのリストを睡眠データのグリッドで置き換えます。

睡眠トラッカー アプリには、次の図に示すように、フラグメントで表される 2 つの画面があります。

左側の最初の画面には、トラッキングを開始および停止するボタンがあります。画面にユーザーの睡眠データの一部が表示されます。[消去] ボタンをクリックすると、そのアプリがユーザーのために収集したすべてのデータが完全に削除されます。右の 2 番目の画面では、睡眠の質の評価を選択しています。

このアプリは、UI コントローラ、ビューモデル、LiveData を含むシンプルなアーキテクチャ、および睡眠データを保持するための Room データベースを使用します。

睡眠データは RecyclerView に表示されます。この Codelab では、GridLayout を使用するようにアプリを変更します。最終的な画面は以下のスクリーンショットのようになります。

前の Codelab では、fragment_sleep_tracker.xmlRecyclerView を追加したときに、カスタマイズを行わずに LinearLayoutManager を追加しました。このコードは、データを縦方向のリストとして表示します。

app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"

LinearLayoutManagerRecyclerView の最も一般的でシンプルなレイアウト マネージャーであり、子ビューの水平方向と垂直方向の両方のプレースメントをサポートします。たとえば、LinearLayoutManager を使用すると、ユーザーが横にスクロールする画像のカルーセルを作成できます。

GridLayout

もう 1 つの一般的なユースケースは、ユーザーに大量のデータを表示する必要がある場合です。これを実現するには GridLayout を使用します。RecyclerViewGridLayoutManager は、以下に示すように、スクロール可能なグリッドとしてデータを配置します。

デザインの観点から見ると、GridLayout はアイコンまたは画像として表現できるリスト(写真ブラウジング アプリ内のリストなど)に最適です。睡眠管理アプリでは、毎晩の睡眠を大きなアイコンのグリッドとして表示できます。このデザインでは、睡眠の質の概要を一目で確認することができます。

GridLayout がアイテムを配置する方法

GridLayout は、行と列からなるグリッドにアイテムを配置します。縦方向のスクロールを想定した場合、デフォルトでは、各行の各アイテムは 1 つの「スパン」を占有します。(この場合、1 つのスパンは 1 つの列の幅に相当します)。

以下に示す最初の 2 つの例では、各行が 3 つのスパンで構成されています。デフォルトでは、GridLayoutManager は、指定したスパン数に達するまで、各アイテムを 1 つのスパンに配置します。指定したスパン数に達すると、次の行に折り返します。

デフォルトでは、各アイテムは 1 つのスパンを使用しますが、占有するスパンの数を指定することで、アイテムの幅を広げることができます。たとえば、右端の画面に表示されている以下の項目は 3 つのスパンで構成されています。

このタスクでは、前の演習で使用した RecyclerView を取得し、GridLayoutManager を使用してデータを表示するように更新します。前の Codelab で作成したスリープ トラッカー アプリを引き続き使用することも、GitHub から RecyclerViewGridLayout-Starter アプリをダウンロードすることもできます。

ステップ 1: LayoutManager を変更する

  1. 必要に応じて、GitHub からこの Codelab の RecyclerViewGridLayout-Starter アプリをダウンロードし、Android Studio でプロジェクトを開きます。
  2. fragment_sleep_tracker.xml レイアウト ファイルを開きます。
  3. sleep_list RecyclerView 定義からレイアウト マネージャーを削除します。

削除するコード:

app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager
  1. SleepTrackerFragment.kt を開きます。
  2. OnCreateView() で、return ステートメントの直前に、3 つのスパンを含む新しい垂直方向の上から下の GridLayoutManager を作成します。

    GridLayoutManager コンストラクタには、最大で 4 つの引数を指定します。コンテキストは activity、数値スパン(列はデフォルトの垂直レイアウト)、向き(デフォルトは垂直)、そしてリバース レイアウト(デフォルトは false)です。
val manager = GridLayoutManager(activity, 3)
  1. その行の下で、この GridLayoutManager を使用するように RecyclerView に指示します。RecyclerView はバインディング オブジェクト内にあり、sleepList と呼ばれます。(fragment_sleep_tracker.xml をご覧ください)。
binding.sleepList.layoutManager = manager

ステップ 2: レイアウトを変更する

list_item_sleep_night.xml の現在のレイアウトでは、1 行ごとに 1 泊ごとにデータが表示されます。このステップでは、グリッド用にコンパクトな正方形のアイテム レイアウトを定義します。

  1. list_item_sleep_night.xml を開きます。
  2. sleep_length TextView は新しいデザインでは不要のため、削除します。
  3. quality_string TextViewImageView の下に移動させます。これを行うには、かなり多くの項目を更新する必要があります。quality_string TextView の最終レイアウトは次のとおりです。
<TextView
   android:id="@+id/quality_string"
   android:layout_width="0dp"
   android:layout_height="20dp"
   android:textAlignment="center"
   app:layout_constraintBottom_toBottomOf="parent"
   app:layout_constraintEnd_toEndOf="@+id/quality_image"
   app:layout_constraintHorizontal_bias="0.0"
   app:layout_constraintStart_toStartOf="@+id/quality_image"
   app:layout_constraintTop_toBottomOf="@+id/quality_image"
   tools:text="Excellent!!!"
   app:sleepQualityString="@{sleep}" />
  1. [Design] ビューで、quality_string TextViewImageView の下に配置されていることを確認します。

データ バインディングを使用したため、Adapter 内の何も変更する必要はありません。コードが正常に機能し、リストがグリッドとして表示されるはずです。

  1. アプリを実行して、睡眠データがグリッドでどのように表示されるかを確認します。

    ConstraintLayout は引き続き幅全体を使用します。GridLayoutManager は、スパンに基づいて、ビューの幅を固定します。GridLayoutManager は、グリッドをレイアウトして、空白文字またはクリッピング項目を追加するときに、すべての制約を満たすよう最善を尽くします。
  1. SleepTrackerFragment で、GridLayoutManager を作成するコードで、GridLayoutManger のスパン数を 1 に変更します。アプリを実行するとリストが表示されます。
val manager = GridLayoutManager(activity, 1)
  1. GridLayoutManager のスパンの数を 10 に変更して、アプリを実行します。GridLayoutManager は 10 行連続で収まるように見えますが、各部分はクリップされます。
  2. スパン数を 5 に、方向を GridLayoutManager.VERTICAL に変更します。アプリを実行すると、横方向にスクロールできることに気付きます。これを美しくするには、別のレイアウトが必要になります。
val manager = GridLayoutManager(activity, 5, GridLayoutManager.HORIZONTAL, false)
  1. スパン数を 3 に戻し、向きを縦向きに戻すことを忘れないでください。

Android Studio プロジェクト: RecyclerViewGridLayout

  • レイアウト マネージャーは、RecyclerView 内のアイテムの配置方法を管理します。
  • RecyclerView には、一般的なユースケースに対応するレイアウト マネージャーが最初から用意されています。たとえば、水平リストと垂直リストには LinearLayout、グリッドには GridLayout を使用できます。
  • より複雑なユースケースでは、カスタムの LayoutManager を実装します。
  • デザインの観点から見ると、GridLayout はアイコンまたは画像として表現できるアイテムのリストに最適です。
  • GridLayout は、行と列からなるグリッドにアイテムを配置します。縦方向のスクロールを想定した場合、各行のアイテムは「スパン」と呼ばれます。
  • アイテムで使用するスパンの数をカスタマイズし、カスタム レイアウト マネージャーを使用せずに魅力的なグリッドを作成できます。
  • グリッド内の 1 つのアイテムに対するレイアウトを作成します。レイアウト マネージャーがアイテムの配置を処理します。
  • RecyclerViewLayoutManager は、<RecyclerView> 要素を含む XML レイアウト ファイル、またはプログラムで設定できます。

Udacity のコース:

Android デベロッパー ドキュメント:

このセクションでは、インストラクターが主導するコースの一環として、この Codelab に取り組む生徒の課題について説明します。教師は以下のことを行えます。

  • 必要に応じて課題を割り当てます。
  • 宿題の提出方法を生徒に伝える。
  • 宿題を採点します。

教師はこれらの提案を少しだけ使うことができます。また、他の課題は自由に割り当ててください。

この Codelab にご自分で取り組む場合は、これらの課題を使用して知識をテストしてください。

次の質問に答えてください。

問題 1

Android が提供するレイアウト マネージャーは次のうちどれですか。該当するものをすべて選択してください。

LinearLayouManager

GridLayoutManager

CircularLayoutManager

StaggeredGridLayoutManager

質問 2

「スパン」とは何ですか?

GridLayoutManager が作成したグリッドのサイズ。

▢ グリッド内の列の幅。

▢ グリッド内のアイテムのディメンションです。

▢ 垂直方向のグリッド内の列の数。

次のレッスンを開始する: 7.4: RecyclerView アイテムを操作する