ListView
ListView は、リストを表示する View。
まんまだ・・・。
コンテンツが多い場合は、自動的にスクロールバーが表示される。
Android Developers:ListView
表示の仕方は色々あるようだ。
あれこれサイトを見て回ったが、現在のところ ListView を利用するためには
これを表示するための XML レイアウトファイルがどうしても必要みたい。
できれば、XML ファイルは触りたくなかったんだけどなぁ。
ただ、勘違いしないこと。
ListView はいつも通り、レイアウトファイルでも Java コードでもどちらでも配置できる。
- <?xml version="1.0" encoding="utf-8"?>
- <ListView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/list"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" />
としてもいいし
- ListView list = new ListView(this);
- layout.addView(list, new LinearLayout.LayoutParams(FP, WC));
としてもいい。
と思っていたら大変な記事を発見してしまった・・・。
まず,view.xmlという表示用のレイアウトを作成する。
上のリスト1にあるようにListViewのidは@android:id/listに決まっている。
データが存在しないときに,表示するTextViewのidも@android:id/emptyに決まっている。
そこまで決めなくてもよいように思うのだが,違うidにするとエラーになる。ITpro:こうしろうのMindStorms日記 第325話 お約束が多くないか
そのうち試してみよう。
しかし、私が今まで触れてきた多言語フレームワークと違い
ListView の中身は別個定義しなければならない(定義できる)ので
中身用の XML レイアウトファイルが必要となる というわけだ。
中身とは何か。
リスト1行毎の表示内容という意味。
Flex の itemRenderer のイメージ。
ごく基本的なリストは、テキストが並ぶものであろうから
この場合は、TextView を必要な数だけ配置する。
もっともシンプルな1列のリストなら、これで事足りる。
- <?xml version="1.0" encoding="utf-8"?>
- <TextView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/name"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" />
逆にテキストだけでなく、様々な View を利用したければ
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <ImageView
- android:id="@+id/image"
- android:layout_width="100"
- android:layout_height="100"/>
- <CheckBox
- android:id="@+id/check"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@+id/image"/>
- <TextView
- android:id="@+id/name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/check"
- android:layout_toRightOf="@+id/image"/>
- </RelativeLayout>
このように、多種類の View を利用し、レイアウトも自由にできる 。
それぞれの View に書式設定を加えてやれば、見た目も自由にできる 。
以上のようなわけで XML ファイルの追加 のようにして
に XML ファイルを作成する。
ファイル名は自由。
ここでは例として list_item.xml と命名したことにする。
作成すると自動的に以下のファイルに登録され、コード内で使えるようになる。
- /* AUTO-GENERATED FILE. DO NOT MODIFY.
- *
- * This class was automatically generated by the
- * aapt tool from the resource data it found. It
- * should not be modified by hand.
- */
- package com.example.hoge;
- public final class R {
- *** 略 ***
- public static final class layout {
- public static final int list_item=0x7f030000; /* ←注目 */
- public static final int main=0x7f030001;
- }
- *** 略 ***
- }
準備が終わったらいよいよ ListView にデータをバインドする。
この方法が色々あるっぽいので、見つけて確認しながらまとめていく。
文字通り配列を利用してデータバインド。
Android Developers:ArrayAdapter
- <?xml version="1.0" encoding="utf-8"?>
- <TextView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/name"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- />
- //データ配列
- String[] data = {"中居", "木村", "稲垣", "草薙", "香取"};
- //アダプタインスタンスを生成
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, data);
- ListView list = new ListView(this);
- list setAdapter(adapter);
- layout.addView(list, new LinearLayout.LayoutParams(FP, WC));
またこんな手法もあった。
- //アダプタインスタンスを生成
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item);
- // アイテムを追加
- adapter.add("中居");
- adapter.add("木村");
- adapter.add("稲垣");
- adapter.add("草薙");
- adapter.add("香取");
- ListView list = new ListView(this);
- list setAdapter(adapter);
- layout.addView(list, new LinearLayout.LayoutParams(FP, WC));
更に・・・下の SimpleCursorAdapter が上手くいかないので
DB からの取得結果を配列に入れて ArrayAdapter にてバインドする手法も成功した。
- //既存データの読み込み
- Cursor cursor = db.query(DB_TABLE, new String[]{"name"}, null, null, null, null, null);
- if (cursor.getCount() != 0) {
- //アダプタインスタンスを生成
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item);
- boolean isEof = cursor.moveToFirst();
- while (isEof) {
- adapter.add(cursor.getString(1));
- isEof = cursor.moveToNext();
- }
- }
- ListView list = new ListView(this);
- list setAdapter(adapter);
- layout.addView(list, new LinearLayout.LayoutParams(FP, WC));
Android Developers:SimpleCursorAdapter
SimpleCursorAdapter を利用した手法はどうも上手くいかない。
よそ様のサイトにあるサンプルを動かすとちゃんと動くのだが
自作のは動かない・・・。
後々のためにいくつかメモ。
多くのサンプルが main.xml と list.xml を用いているが
自作品はできるだけ XML レイアウトファイルを使いたくないため list.xml のみ。
今のところ見つけられたサンプルは、こちらのみ。
愚鈍人:SQLiteでデータベース
こちらの真ん中辺りにある
CursorAdapterを使ってSQLiteの検索結果をListViewに表示する。
ListView は java で定義し、中身の TextView のみ XML レイアウトファイルを利用。
上記サンプルは正常に稼動。
サンプルと自作品の気になる相違点
- サンプルはデータベース名がない
→ サンプルのデータベース名を設定するように変更しても無事稼動 - サンプルのカラムは name, age のみで _id がない
SQL 文内で rowid as _id としている
自作品は _id, name, col1, col2, col3 - データ取得が、サンプルは rawQuery、自作品は query
自作品を rawQuery で試しても変化なし
注意点
ID カラムの名称を _id にしなけらばならない。 らしいがこれはしてある。
いつか解決しますように!