8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-03-02

動機

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/

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?