woshidan's blog

あいとゆうきとITと、とっておきの話。

ArrayAdapterとViewHolderの関係について

参加しているプロジェクトのコードを読んで少し興味が出てきたので調べました。

参考のために読んでた記事とか。

Why is my list black? An Android optimization | Android Developers Blog

Tumbling Dice — [Android]ListViewのレイアウトを動的に切り替える際の問題点

Making ListView Scrolling Smooth | Android Developers

ArrayAdapterについておさらい

ArrayAdapter周りでどのクラスが何をしているかがちょっとよく分かってなかったので整理。

  • リストビューで表示に使いたいデータを持っているオブジェクトの配列 T[] objects
  • T[]を持っている ArrayAdapter
  • T objectを表示するためのView

が基本的にいます。

ArrayAdapterに追加なり、コンストラクタでなりでオブジェクトの配列T[]が与えられます。

次に、表示範囲の View を表示させるために ArrayAdapter#getView() を呼び出し、その中で LayoutInflater#inflate によって用意してあるxmlから View を作成します(既にViewインスタンスがあれば使い回します)。

findByViewメソッドを使ってレイアウトのxmlに配置されている子要素 View を取得します。

たぶん、だいたいこんな感じ。

ViewHolderを使う

実は findByView もそれなりに重いので、可能な限りやりたくありません。なので、 下記のように View を保持するためのクラス ViewHolder を用意して、一度取得した参照を使い回します。 なのですこし軽くなります。

// http://outofmem.tumblr.com/post/101241273599/androidlistview%E3%82%92%E4%BD%BF%E3%81%86%E3%81%9F%E3%82%81%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%981 より
    static class ViewHolder {
        TextView id;
        TextView name;
    }

RecyclerViewって

  • RecyclerView で扱う View
  • ArrayAdapter では扱い難いオブジェクトの状態によって View を使い回すという目的で生まれたっぽい
  • バインディングをやり直す必要のある度合いによって Recycle Scrap Dirty
  • オブジェクトの状態によって配置を変えるための RecyclerView.LayoutManager とビューを追加、削除等をするための RecyclerViewAdapter を使う
  • AdapteronCreateViewHolder にて ViewHolder を作る際、ItemViewType で利用するべき View を決める。

この記事が分かりやすくてありがたいです。

【Android】RecyclerViewの基本的な実装 - Qiita

しない気がしますが、分かり次第追記するかな。