Edited at

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

More than 1 year has passed since last update.


動機

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/