AndroidのViewHolderパターンをKotlinでいい感じに書く

動機

AndroidのListViewなどで使われるViewHolderパターンをJavaで書いているような形をそのままKotlinで書いてしまうとなんだか気持ちがわるいコードになっていたのでいい感じに書けないか考えてみた。

やってみる

Java版

https://www.javacodegeeks.com/2013/09/android-viewholder-pattern-example.html

ここで紹介されているViewHolderパターンを元にKotlinのコードでいい感じに書いてみます。

HogeAdapter.java
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolderItem viewHolder;
    if(convertView==null){
        LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
        convertView = inflater.inflate(layoutResourceId, parent, false);
        viewHolder = new ViewHolderItem();
        viewHolder.textViewItem = (TextView) convertView.findViewById(R.id.textViewItem);
        convertView.setTag(viewHolder);
    }else{
        viewHolder = (ViewHolderItem) convertView.getTag();
    }

    ObjectItem objectItem = data[position];
    if(objectItem != null) {
        viewHolder.textViewItem.setText(objectItem.itemName);
        viewHolder.textViewItem.setTag(objectItem.itemId);
    }

    return convertView;

}

Kotlin版

Java版をKotlinで書き換えるのですが、そのまま書き換えるとvarを使った再代入のあるコードになってしまいそう。
Kotlinではfinalな変数をvalで簡単に表現できます。
せっかくなのでそっちを使う方向に持っていきたいと思います。
Pairを使えばいい感じに書けそう?

HogeAdapter.kt
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
}

// 動作確認していないので動くかわからない…

varを使わずにViewHolderパターンを書くことができました :sparkles:

他にも良い書き方があれば教えていただけるとー

参考

https://www.javacodegeeks.com/2013/09/android-viewholder-pattern-example.html
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-pair/

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.