Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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

動機

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パターンを書くことができました :sparkles:

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

参考

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
5
Help us understand the problem. What are the problem?