KotlinのViewHolderパターンがとても気持ちいい

Kotlinのコードを書いていて、ArrayAdapterを実装するのにViewHolderのKotlin化がとても良い書き方を見つけたのでメモ。

Kotlinでは簡略化して書けるので、その意味をしっかり理解しないといけないから学ぶことは多いですね。
参考になりそうだと思ったサイトは以下。

ViewHolderの実装はgetView()メソッドをオーバーライドした時、引数で渡されてくるconvertViewを処理するところがよくある定型的な書き方ですけど、これがKotlinだとPairを使ったらとても気持ちよくかけます。

上記の記事では、以下のようなコードをおすすめしています。

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らしくして、以下みたいに直してみています。

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
}

もうちょっと見直しできそうな気がしますね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です