ListViewに挑む!編集編

アイテムを追加する。 表示編の続きでいいです。

EditTextとボタン二つとListViewを置く

ボタンは一つはSubmit、一つはクリアとする。ボタン二つは横に並べますか。

メンバ変数のlistをMutableListで定義

listOfのままだったらMutableListに変更してください。リストは空でもいいですし、テスト用に最初に2〜3個何か入れておいてもいいです。

Submitのonclickの処理を書く

mutable listにedit textの内容をaddしてedit textはクリア、 さらにadapterのnotifyDataSetChanged()を呼ぶ

クリアのonclickの処理を書く

mutable listのclearを呼び出して、adapterのnotifyDataSetChanged()を呼ぶ

課題: 「削除」ボタンもつけよう

アイテムごとの方のlayoutに「削除」というボタンを追加し、それが押されたらそのアイテムが削除されるようにしよう。

具体的にはlistDataからその要素をremoveAtで削除してnotifyDataSetChangedを呼べば良い…のだけど、getViewの中からadapterを触ろうとするとエラーになります。

adapterの型解決の問題を解決する

adapterのgetViewの中からadapterを触るとエラーになる。 これは少しややこしい事が理由なので説明は難しいのだけれど、解決策は簡単です。

こんな感じのコードがあったとして、

    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
            view.findViewById<Button>(R.id.itemButton).setOnClickListener {
                listData.removeAt(position)
                adapter.notifyDataSetChanged()
            }
            return view
        }
      }
    }

この1行目の最初の以下の部分を、

    val adapter by lazy 

このadapterに、型をつけてやればよい。型はArrayAdapter<String>です。つまり、以下のよううに、adapterの後にコロンでArrayAdapter<String>を足せば良い。

    val adapter : ArrayAdapter<String> by lazy 

これで動きます。

これはかなりややこしい話なので、「getViewでadapterを使いたい時はこうしないといけない」と丸暗記してください。