Kotlinのコードを書いていて、ArrayAdapterを実装するのにViewHolderのKotlin化がとても良い書き方を見つけたのでメモ。
Kotlinでは簡略化して書けるので、その意味をしっかり理解しないといけないから学ぶことは多いですね。
参考になりそうだと思ったサイトは以下。
ViewHolderの実装はgetView()メソッドをオーバーライドした時、引数で渡されてくるconvertViewを処理するところがよくある定型的な書き方ですけど、これがKotlinだとPairを使ったらとても気持ちよくかけます。
上記の記事では、以下のようなコードをおすすめしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { val (viewHolder, view) = if (convertView == null ) { val inflater = (context as Activity).getLayoutInflater() val view = inflater.inflate(layoutResourceId, parent, false ) val viewHolder = ViewHolderItem() viewHolder.textViewItem = view.findViewById(R.id.textViewItem) as TextView view.setTag(viewHolder) Pair(viewHolder, view) } else { Pair(convertView.tag, convertView) } val objectItem = data[position] if (objectItem != null ) { viewHolder.textViewItem.text = objectItem.itemName viewHolder.textViewItem.tag = objectItem.itemId } return view } |
けど、個人的にはここから更にKotlinらしくして、以下みたいに直してみています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { val (viewHolder, view) = when (convertView) { null -> { val inflater = (context as Activity).getLayoutInflater() val view = inflater.inflate(layoutResourceId, parent, false ) val viewHolder = ViewHolderItem() viewHolder.textViewItem = view.findViewById(R.id.textViewItem) as TextView view.tag = viewHolder viewHolder to view } else -> convertView.tag as ViewHolder to convertView } val objectItem = data[position] if (objectItem != null ) { viewHolder.textViewItem.text = objectItem.itemName viewHolder.textViewItem.tag = objectItem.itemId } return view } |
もうちょっと見直しできそうな気がしますね。
「KotlinのViewHolderパターンがとても気持ちいい」への1件のフィードバック