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
を使う Adapter
でonCreateViewHolder
にてViewHolder
を作る際、ItemViewType
で利用するべきView
を決める。
この記事が分かりやすくてありがたいです。
【Android】RecyclerViewの基本的な実装 - Qiita
しない気がしますが、分かり次第追記するかな。