ListViewを簡単なモデルで理解しよう (Android Kotlin)



上図が完成イメージだ。標準に搭載されているタイムゾーンの配列をTimeZone.getAvailableIDs()で取得して、一覧表示するという単純な仕様となっている。APIなど複雑な処理はないのでリストビューの理解だけに集中できるように進めていく。




ListViewのレイアウトファイルを作る


配置したListViewの行のレイアウトファイルを作りたい場合は、ListViewをクリックして、listitemの項目の...をクリック。開いたダイアログの右上から、New layout Fileを選択して作成すると簡単だ。



こんな感じにレイアウトする。




リストの行のタップ領域高さは、48dp以上が推奨されているようだ。あまりに狭いと、ユーザビリティが悪くなるので気をつけよう。




基本のListView


BaseAdapterクラスを継承した、TimeZoneAdapterクラスを作成する。



getViewの部分が一番混乱するところだろう。次のようなことをやっているのがgetViewだ。



getViewは、positionに指定された行のViewを返す。Viewが生成されていないならinflaterで生成し、すでに存在すれば、そのViewを使い回す。また、実際の値をリストに設定する処理もここで書く。


ViewHolderで速度改善


実は先程のプログラムは、次の部分に問題がある。

スクロールするたびに、findViewByIdを呼び出すのはコストがかかるのだ。つまりスクロール動作が遅くなる。そこで登場するのがViewHolderパターンだ。



Viewにはtagプロパティというのがあり、そこに任意のオブジェクトを1つ持つことができる。このことを利用して、予めtimeZoneLabelなどのインスタンスを生成して持たせておくのだ。
convertViewはリサイクルされるので、tagに持たせたオブジェクトも再利用されるはずである。


そして次のコードが、 ViewHolderパターンに書き換えたものだ。



ListViewの動作が重いと思ったら、ここを見直してみよう。


MainActivityにListViewを実装する


最後に、アクティビティにListView実装しよう。



これで完成だ。




createView が呼び出される回数を確認


createViewが何回呼び出されるか確認するために、カウンターを追加して測定してみた。Viewがリサイクルされるならば、カウンターの値は一定値以上にはならないはずだ。



リストをスクロールすると11回まで呼び出され、それ以上は呼び出されなかった。これで、Viewがリサイクルされていることが確認できた。




今回のプロジェクトファイルはGithubへ上げておいたのでご参考に。
https://github.com/araemon/AndroidExercise/tree/master/TryListView/app/src/main/java/com/apppppp/trylistview




参考


基本からしっかり身につくAndroidアプリ開発入門 Android Studio 3対応 (「黒帯エンジニア」シリーズ)


関連記事


非同期 & ネットワーク処理
はじめてRetrofitを使ってみる (Android Kotlin)
非同期処理でCoroutine(コルーチン)を使ってみる (Android Kotlin)
OkHttpでHTTP通信 (Android Kotlin)
スレッド処理 (Android Kotlin)

View & レイアウト
リサイクラービューを使ってリスト表示 (Android Kotlin)
角丸表現 (Android Kotlin)
onSaveInstanceStateで画面回転時の状態の保存と復元 (Android Kotlin)
ListViewを簡単なモデルで理解しよう (Android Kotlin)
バネアニメーション (Android Kotlin)
startActivityForResultを使ってみる (Android Kotlin)
ActivityとFragmentの連携を理解する (Android Kotlin)
DataBinding機能を使ってみる (Android Kotlin)
タッチイベントのフック (Android Kotlin)
DialogFragmentを使ったダイアログの表示 (Android Kotlin)

サウンド
これってSoundPoolのバグ?(Android Kotlin)
SoundPoolを使ってゲームの効果音を再生する (Android Kotlin)

データ & オブジェクト
Kotlinでオブジェクト(object)の動作確認
データクラスとタプル (Android Kotlin)
Null安全、ぬるぽバイバイ (Android Kotlin)




あなたにおすすめ