ListViewについて基本を整理しようと思いまとめました。
公式ドキュメント
ListView | Android Developers
ちなみに、もともとRecyclerViewについて知りたくて調べ始めたため、以下、ListViewとRecyclerViewで共通のことだけ書いています。
ListViewについて
ListViewはViewをリスト表示するためのView。
※つまり、「(行となる子の)Viewをリスト表示する(親の)View」がListViewということになる)
さらにただリスト表示させてスクロールできるだけではなくて、スクロールアウトして表示されなくなった子Viewを再利用することでメモリの消費を抑えている。
Adapter
ListView自体には、
- ある行の子Viewの内容
- 全行数
などの情報は保持されない。
それを保持するためにAdapterと呼ばれるクラスを別につくって、onCreate()などの時に渡すことになっている。
公式ドキュメント アダプタを使ったレイアウトをビルドする
ある行に当たる子Viewは大体自作されることが多く、その場合はAdapterも自作のクラスになるので、基本Adapterは自作するものと思っていい。
※自作というか、以下のインターフェースを実装する。
Adapter | Android Developers
Adapterに以下のようなメソッドを持たせておく。
- getView()
- 一行分のViewを作って返させる
- add()
- 一行分のViewのもとになる情報(データを保持したPOJOとか)を与える
呼び出し側のActivityのonCreate()などでは、Adapter.add()によって情報を渡しておき、ListView.setAdapter()でAdapterを設定することで、画面に表示がされることになる。
ViewHolder
普通に上記のAdapter.getView()を実装しようとした場合、行となる子Viewに含まれるTextViewなどの実際のViewをいちいちfindViewByIdで探しては、そこにPOJOなどのモデルクラスから得た情報を設定する必要がある。
findViewByIdのコストが割と高いので、そのままだとパフォーマンスが上がらない処理になる。
このため、ViewHolderと呼ばれるクラスを別途自作しておいて、そこにfindViewByIdの結果を保持させておく。
ListViewまとめ
ということでListViewで画面表示する場合、大体以下が関連してくる
- Activity(かFragment)
- 呼び出し元
- ListView
- 表示するView(+子Viewが行になっていて、その子ViewもいくつかのViewでできている)
- Adapter
- ListViewに表示する際の処理を各クラス
- ViewHolder
- Adapterの処理のために1行分にあたる子Viewが持っている孫Viewの情報を保持する(実装必須ではない)