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[]を持っているArrayAdapterT 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で扱うViewArrayAdapterでは扱い難いオブジェクトの状態によってViewを使い回すという目的で生まれたっぽい- バインディングをやり直す必要のある度合いによって
RecycleScrapDirty - オブジェクトの状態によって配置を変えるための
RecyclerView.LayoutManagerとビューを追加、削除等をするためのRecyclerViewAdapterを使う AdapterでonCreateViewHolderにてViewHolderを作る際、ItemViewTypeで利用するべきViewを決める。
この記事が分かりやすくてありがたいです。
【Android】RecyclerViewの基本的な実装 - Qiita
しない気がしますが、分かり次第追記するかな。