iOS開発者のAndroid開発入門(ListView)

botman3 Android

Android Studio-4.1.1 Kotlin-1.4.21

はじめに

Android の ListView の使い方を忘れてしまっていたので ListView の使い方についてまとめておきます(検索してもぱっとコードが出てこなかった。。。)。

ListView は一覧表示するときお世話になるのでこれさえ使えればわりと色々なアプリをつくれる気がします(iOS でいう UITableView だと思います)。

Cursor 系はよくわかってないので機会があればまた更新したいと思います。。。

ソース(github)ここをいい感じにしていきたい。

ListView

ListView

ListView の定義は下記です。

XML attributes で下記の値が設定できるようです。

ListView 自体はどのような View を表示するという情報は持っておらず ListAdapter に対して表示する View を要求するみたいです(ListAdapterUITableViewDataSourece + UITableViewCell 相当だと思います)。

つまり ListView で一覧表示したい場合はアダプター(ListAdapter)の設定が必須です。表示の更新とかもアダプターを介しておこないます。

アダプター

ListAdapter

ListAdapter の定義は下記です。

ListAdapter を継承したクラスは下記 8 つが用意されているようです。

ArrayAdapter

ArrayAdapter

定義は下記です。

1つのテキストを表示したい場合に使うようです。設定したリストのテキストが TextView に表示されます。下記のコンストラクタが用意されています。

引数

  • Context
    何か適当なやつを。。。
  • resource
    レイアウトファイルの ID です(TextView 必須)。
  • textViewResourceId
    リストの項目を表示する TextView の id(レイアウトを自作するときに使う)。
  • objects
    表示するリストです。

resource

レイアウトファイルの ID です。レイアウトファイルには少なくとも1つの TextView が必須です。
自作しなくても1つの TextView を表示するだけなら android.R.layout.simple_list_item_1 が用意されています。

こんな感じで使います。

textViewResourceId

リストの項目を表示する TextView の ID です。レイアウトを自作する場合に利用するものと思われます。

下記のようなレイアウトファイルを作成します。

下記のように設定するとリストが表示されました。

レイアウトファイルを修正すれば複数の View を置くことも可能です。ただし、可変で値を設定できるのは ID を指定している TextView のみです。

こんな感じ。

array_1

objects

表示する項目のリストです。Mutable ではない場合は Adapterclear()add() といったメソッドを使用したときにクラッシュしてしまいます。

型は String に変換できるなら何でもいいみたいです。試しに下記のように設定してみるとちゃんと表示されました。

こんな感じです。

array_2

BaseAdapter

BaseAdapter

定義は下記です。

カスタムアダプターを作るときに継承させるクラスです。これさえ使えればだいたいいける気がします。

使い方

レイアウトファイルと BaseAdapter を継承したカスタムクラスを用意します。

ポイントは getView() の部分です。View の生成と findViewById はコストが高めなのでここを注意しないとスクロールがカクカクしてしまいます。convertViewnull の場合のみView を生成し、毎回 findViewById をしないように生成時に ViewHolder で各 View を保持しておきます。

あとは ListView に設定するだけです。

こんな感じ。

base

SimpleAdapter

SimpleAdapter

定義は下記です。

Map の一覧を表示する場合に使うみたいです。表示はテキストのみです。

コンストラクタは下記が用意されています。

引数

  • context
    何か適当なやつを。。。
  • data
    表示するデータ。キーは from に対応してる必要があります。
  • resource
    レイアウトファイルの ID です。
  • from
    表示したいデータの Map のキー一覧です。
  • to
    from に対応した TextView の ID 一覧です。

使い方

レイアウトファイルを下記のように作成します。

ListView の設定は下記。

こんな感じです。

simple

WrapperListAdapter

WrapperListAdapter

定義は下記です。

アダプターをラップするアダプター?? getWrappedAdapter() で何をラップしてるか取得できるらしいですがイマイチ使い方はわかりません。。。

List adapter that wraps another list adapter. The wrapped adapter can be retrieved by calling getWrappedAdapter().

HeaderViewListAdapter

HeaderViewListAdapter

定義は下記です。

ヘッダーがある ListView を扱う際に使われるらしい。。。(ちょっとよくわかってない)

おそらく addHeaderView(), addFooterView() とかでヘッダー・フッターを表示するとその Adapter が HeaderViewListAdapter でラップされるんだと思われます。

getHeadersCount() などのメソッドが用意されているのでヘッダー・フッターを操作したいときに使うのかも??

ListAdapter used when a ListView has header views. This ListAdapter wraps another one and also keeps track of the header views and their associated data objects.

This is intended as a base class; you will probably not need to use this class directly in your own code.

CursorAdapter

CursorAdapter

定義は下記です。

DB で扱う Cursor を扱う用のアダプター。たぶん大量にデータを扱う際に使う??(ちょっとわからない。。。)

CursorAdapter を継承したカスタムクラスを作って使う??
下記2つのメソッドで表示処理を行うんだと思われます。

コンストラクタは下記2つが用意されている模様。

引数

  • context
    何か適当なやつを。。。
  • c
    表示するデータ。
  • autoRequery
    true にすると常に最新のデータを DB から取って表示してくれるらしい(けど true にはしない方がいいらしい??)。
  • flags
    アダプタの動作を決定するために使用されるフラグ??(FLAG_AUTO_REQUERY , FLAG_REGISTER_CONTENT_OBSERVER

ResourceCursorAdapter

ResourceCursorAdapter

定義は下記です。

コンストラクタは下記2つが用意されている模様。

引数

下記以外は CursorAdapter と同様。

  • layout
    レイアウトファイルの ID です。

CursorAdapter で必要な View をレイアウトファイルで指定して使うんだと思います(よくわかってない。。。 CusorAdapter でカスタムしたい場合は基本こいつを継承させるのかも??)。

SimpleCursorAdapter

SimpleCursorAdapter

定義は下記です。

テキスト表示だけの場合に使うのかも??

用意されているコンストラクタは下記1つの模様。

引数

下記以外は ResourceCursorAdapter と同様。

  • from
    表示したいデータの DB のカラム名一覧です。
  • to
    from に対応した TextView の ID 一覧です。

ヘッダー・フッター

ListView には下記メソッドが用意されており、これでヘッダー・フッターを表示するようです。

上記のように設定するとこんな感じになりました。

header

ヘッダー・フッターは複数設定できるようです。KITKAT 以前は Adapter 設定前に add() する必要があったようですが今はどこでもいいみたいです。

おわりに

これで一覧表示がだいたいできるようになりました!

セクション表示とかもっと色々やりたい場合は RecyclerView を使うみたいです(ちょっとだけ設定がめんどくさい)。

ListView

For a more modern, flexible, and performant approach to displaying lists, use android.support.v7.widget.RecyclerView.

参考

コメント

タイトルとURLをコピーしました