ArrayAdapter

ListViewのレイアウトを変えたり、1アイテムに複数の項目を表示したい場合などは、ArrayAdapterを継承し、getViewをカスタマイズする・・・。

ArrayAdapter | Android Developers

まず、名前name, 年齢age, 住所addressからなるListItemクラスを定義・・・。

f:id:BG1:20160425183142p:plain

[New]-[Class]で、

f:id:BG1:20160425183307p:plain

ListItemクラスを作成・・・。

そして、list_item.xmlは、

このようにLinearLayoutと3つのTextViewでそれぞれのメンバを表示する・・・。

ListItemの配列を受け取るArrayAdapterを継承したListItemAdapterを定義する・・・。

[New]-[Class]から、

f:id:BG1:20160425184015p:plain

[Superclass]の[Browse...]を押して、

f:id:BG1:20160425184122p:plain

ArrayAdapterを選択・・・。

f:id:BG1:20160425184211p:plain

これでFinishし、

f:id:BG1:20160425184302p:plain

"<T>"のところは"<ListItem>"とする・・・。

ListItemAdapterを書いていく・・・。

コンストラクタでLayoutInflaterを取得する・・・。

LayoutInflaterは、xmlリソースを動的に差し替える仕組みで、

Androyer in Japan: LayoutInflaterについて勉強する
【Android】LayoutInflaterを使ってみる | ザワプロ!

こちらを参照のこと・・・。

まあ、難しいので最初はこういうものだとおもっていい・・・。

こちらがキモのgetView・・・。
positionに表示するアイテムのインデックス、convertViewにアイテムテンプレートが入る・・・。
parentは今回は使わない・・・。

ConvertViewの再利用の解釈 - satohu20xx's diary

convertViewがnullの場合は、新しいアイテムを表示するということでinflater.inflateでビューを作成し、
そうでないときは、既存のビューを再利用する仕組みになっている模様・・・。

convertView.findViewByIdで各要素のTextView(名前ならtvname)を取得、getItem(position)で表示するListItemが取れるので、tvname.setText(getItem(position).name)という感じで、名前のTextViewの表示を差し替えられる・・・。
tvage, tvaddressも同様に行う・・・。
最後にconvertViewを戻り値に指定・・・。

さて、MainActivity.javaは、

素数3のListItem配列を用意・・・。
ListItemAdapterのadapterをこれまでのようにlistview1.setAdapterでセット・・・。

f:id:BG1:20160425192239p:plain

これで複数項目表示できるようになった・・・。

Sample/MainActivity.java at master · bg1bgst333/Sample · GitHub
Sample/ListItem.java at master · bg1bgst333/Sample · GitHub
Sample/ListItemAdapter.java at master · bg1bgst333/Sample · GitHub
Sample/activity_main.xml at master · bg1bgst333/Sample · GitHub
Sample/list_item.xml at master · bg1bgst333/Sample · GitHub
Sample/strings.xml at master · bg1bgst333/Sample · GitHub
Sample/AndroidManifest.xml at master · bg1bgst333/Sample · GitHub