どろあそび (7)
「Android Kotlin の基礎」のレッスン7はRecyclerViewを扱います。
レッスン6では多くの項目を表示できるようにするため、ScrollViewという画面より大きい表示要素をスクロール可能な形式で部分表示する表示要素を使用していました。
このやり方では表示に使用するメモリなどの資源が多く必要になるとともに再描画にも時間がかかるという問題があるため、RecyclerViewという仕組みが導入されています。
RecyclerViewでは表示する内容を項目ごとに分割し、項目ごとに表示される時点で表示要素を作成します。そしてスクロールにより表示されなくなった時点で表示要素は再利用の対象となるため、資源の節約が可能になっています。
ただし、実装面ではScrollViewを使用する場合、データが準備できた時点で一括表示出力すればよかったものが、RecyclerViewを使用する場合には表示タイミングに応じて発生するコールバックによって該当項目を選択して表示処理を行わなければならないため多少面倒になります。
最初の項目「RecyclerView fundamentals」ではRecyclerViewの導入とRecyclerViewに表示される項目に対応するViewHolderの導入、ViewHolderとデータを結びつけるAdaptorの導入、RecyclerViewとAdaptorの関連付けを行ない、最後にAdaptorにデータを供給することでとりあえずRecyclerViewが動作するようにします。
また、機能を付加する形で動作させたサンプルアプリケーションをリファクタリングしてViewHolderとAdaptorの責務に対応させる手順についても説明されています。
2番目の項目「DiffUtil and data binding with RecyclerView」は前の項目で作成したサンプルアプリの改善としてDiffUtilの使用を扱っています。
前の項目のサンプルではデータに更新があった場合、RecyclerViewが管理するすべての表示項目が更新される構成となっていました。
AdaptorをListAdaptorから派生したクラスとし、かつDiffUtilを使用して更新されたデータレコードを抽出可能とすることでAdaptorは供給されたリストから更新されたデータレコードに対応する表示項目のみを更新できるようになります。
また、この項目ではDataBindingを使用して表示項目のレイアウトにデータレコードを関連づける手順も扱っています。
3番目の項目「GridLayout with RecyclerView」は表示項目が縦横に並ぶグリッドレイアウトを扱います。
RecyclerViewではレイアウトを管理するためにレイアウトマネージャを使用します。ここまでの項目で使用していたLinearLayoutManagerは表示項目を縦1列に並べたもので、いくつかのテキスト項目を含むカード型の表示を並べる場合には都合の良いものですが、アイコンだけを並べるような表示形態では1行に1項目しか表示されないため、表示領域に無駄が生じます。
GridLayoutManagerを使用すると1行に表示する表示項目の数を明治的に指定できるため、例えば1行に3個ずつアイコンを並べるといった構成が可能になります。
ただし画面サイズに応じて動的に表示項目数を変えることはできないようなので、横向き表示に対応するといった場合にはそれなりの対応が必要そうです。
4番目の項目「Interacting with RecyclerView items」はRecyclerViewに表示されている表示項目をタップした場合の動作を扱います。
これまで見てきたように通常はタップの対象となる表示項目にイベントハンドラーを関連づけてタップを処理しますが、RecyclerViewを使用する場合には個々の表示項目ではなくRecyclerViewにイベントハンドラーを関連づけし、イベントハンドラー内でどの表示項目がタップされたかを判断する必要があります。
これは通常の表示項目が1個ずつしか存在しないの対して、RecyclerViewで管理される表示項目は必要に応じて複数インスタンス化されるためではないかと考えられます。
5番目の項目「Headers in RecyclerView」は形状の異なる表示項目の混在について扱います。
グリッドレイアウトは基本的には同じ形状の表示項目が並んでいることを前提としていますが、横長の見出しのような形状の異なる表示項目を使用したい場合があります。
このような場合にはまずViewHolderで表示項目の振り分けを行い、振り分けた表示項目に合わせてGridLayoutManagerに表示項目の幅を通知することで表示幅に応じたレイアウトを実行します。
本題ではないのかもしれませんが、この項目ではデータリストに見出し項目を混在させる処理を別スレッドとしてコルーチンで実行する手順も扱っています。
このレッスンで扱ったRecyclerViewは連絡先アプリのように多数のデータを一覧、検索するアプリの作成に有用だと思われます。
0コメント