ListViewに挑む!表示編、二回目用
かなり難しいところなので何度か繰り返して欲しいListView、 けれど二回目なら最初から自分のレイアウトで試した方がいいと思うので、そのための手順を書いておきます。
ListViewをレイアウトに置く
Layout側にListViewを置き、idをlistViewにする
画面いっぱいになるようにする。
新しいレイアウトを定義して、以下の要件を満たすようにする
- ファイル名はlist_item.xml
- トップはLinearLayout
- TextViewを置く、idはitemLabelとする
- Buttonを置く、idはitemButtonとする、textは”ボタン”とかかな(なんでもいい)
データ100件くらいのlistDataを作る
メンバ変数のところに空のMutableList型のlistData変数をmutableListOfで作って、onCreateで100件くらいfor文でデータを入れる。
メンバ変数にArrayAdapterをlazyで作る
adapterをメンバ変数として定義します。getViewをオーバーライドしたりするのでかなり難解ですが、以下みたいな感じのコードを書きます。
val adapter by lazy { object: ArrayAdapter<String>(this, R.layout.list_item, listData) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view = if(convertView == null) layoutInflater.inflate(R.layout.list_item, null) else convertView
val data = listData[position]
view.findViewById<TextView>(R.id.itemLabel).text = data
return view
}
}
}
showMessageを作る
メンバ関数として、以下をコピペする。
fun showMessage(msg: String) { Toast.makeText(this, msg, Toast.LENGTH_LONG).show() }
onCreateでListViewにadapterをセットする
ListViewをfindVewByIdで取り出して、adapterをセットします
findViewById<ListView>(R.id.listView).adapter = adapter
ボタンが押された時の処理も書いてみる
getViewの中で、以下みたいな感じで何か書く(showMessageでアイテムの内容を使った何かを表示するのがいいかもしれない)
view.findViewById<Button>(R.id.itemButton).setOnClickListener = ...