動機
AndroidのListViewなどで使われるViewHolderパターンをJavaで書いているような形をそのままKotlinで書いてしまうとなんだか気持ちがわるいコードになっていたのでいい感じに書けないか考えてみた。
やってみる
Java版
ここで紹介されている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パターンを書くことができました
他にも良い書き方があれば教えていただけるとー
参考
https://www.javacodegeeks.com/2013/09/android-viewholder-pattern-example.html
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-pair/