ListView
Android,

ListViewの基本

More than 1 year has passed since last update.

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の情報を保持する(実装必須ではない)