ListViewを簡単なモデルで理解しよう【Android/Kotlin】



ListViewを簡単なモデルで実装する


本記事の完成イメージがこちら。


標準に搭載されているタイムゾーンの配列を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へ上げておいたのでご参考に。
» AndroidExercise/TryListView/app/src/main/java/com/apppppp/trylistview at master · araemon/AndroidExercise · GitHub



Kotlinプログラミング

Kotlinは、Javaとの相互運用を可能にし、Android OSでGoogleがフルサポートする静的型プログラミング言語です。この言語は、Javaだけでは十全ではない(Javaだけでは実装に手間がかかりすぎる)、軽量かつ豊かな表現形式や、他言語ではすでに実装されている最新の機能を盛り込んでいます。

KindleAmazon

基本からしっかり身につくAndroidアプリ開発入門

圧倒的な多数のユーザーが使っているヤフーのアプリ。その制作の最前線にいる黒帯エンジニアが、ユーザーが使いやすいアプリの大切な基本をしっかりと解説します。

KindleAmazon



あなたにおすすめ