アクティビティ中でのリストデータ生成
上記方法ではリストデータとしてstrings.xmlに記述された文字列リストを使用しました。この方法は、リストデータが固定の場合には有効ですが、リストデータが可変の場合、Javaで記述する必要があります。同じ定食メニューリストをアクティビティ中で生成するように改造してみましょう。
ソース改造
まず、もともとstrings.xmlに記述されていた<string-array>タグは不要ですので削除してください(コメントアウトでもかまいません)。次に、activity_list_view_sample.xmlの<ListView>タグのandroid:entries属性を削除してください。
その上で、ListViewSampleActivityのonCreate()メソッドに以下の内容を追記してください。
public class ListViewSampleActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
~省略~
List<String> menuList = new ArrayList<String>(); // (1)
menuList.add("から揚げ定食");
menuList.add("ハンバーグ定食");
menuList.add("生姜焼き定食");
menuList.add("ステーキ定食");
menuList.add("野菜炒め定食");
menuList.add("とんかつ定食");
menuList.add("ミンチかつ定食");
menuList.add("チキンカツ定食");
menuList.add("コロッケ定食");
menuList.add("焼き魚定食");
menuList.add("焼肉定食");
ArrayAdapter<String> adapter = new ArrayAdapter<String>(ListViewSampleActivity.this, android.R.layout.simple_list_item_1, menuList); // (2)
listView.setAdapter(adapter); // (3)
}
~省略~
}
アプリを再起動し、動作確認を行ってください。改造前と同じ動きなのが分かるでしょう。
アダプタクラス
上記のようにアクティビティ中でリストデータを生成する場合、以下の手順を取ります。それぞれ、リスト7中の番号に対応しています。
(1)リストデータのListオブジェクト(か配列)を用意します。
(2)上記リストデータをもとにアダプタオブジェクトを生成します。これはAdapterインターフェースを実装したクラスを利用します。よく使われるのは、以下の3種です。それぞれ元となるデータが違います。
- ArrayAdapter:元データとしてList(配列)を利用するアダプタクラス。
- SimpleAdapter:元データとしてList<Map<string,?>>を利用するアダプタクラス。XMLファイルの解析結果を格納するのに便利。
- SimpleCursorAdapter:元データとしてCursorオブジェクトを利用するアダプタクラス。Cursorオブジェクトは、Android端末内のDBを利用する際、SELECT文の結果が格納されたもの。
今回は、定食リストをListで生成していますので、ArrayAdapterを利用しています。このクラスをnewする際、引数が3個必要です。
引数1はコンテキストです。上述の通り、「アクティビティクラス名.this」を記述します。
引数2はリストビューの各行のレイアウトを表すR値です。上述の通り、ListViewは各行に様々な画面部品を埋め込むことができます。これは、それ専用のレイアウトxmlファイルを作ることで実現できます。レイアウトxmlファイルを作成するということはR値が存在します。このR値を指定します。ただ、1行や2行程度のシンプルなレイアウトの場合、Android SDKでもともと用意されています。その中で1行を表すのが、
android.R.layout.simple_list_item_1
です。
引数3はリストデータそのものです。
[Note]android.R
前回解説しましたが、アプリ中のリソースはR値が生成され、Rクラスに記述されます。ところが、Android SDKで用意されたリソースも存在します。これにもR値が存在します。これが記述されたクラスが「android.R」です。アプリ内の独自のRクラスとクラス名が同じですので、android.Rクラスをインポートした場合、独自のRクラスが読み込まれなくなります。したがって、android.Rクラスは絶対にインポートせず、android.RのR値を利用する場合は、
android.R.layout.simple_list_item_1
のように、記述します。
(3)ListViewにアダプタオブジェクトをセットします。これは、ListViewのsetAdapter()メソッドを利用します。
基本はこの方法でアクティビティ中でListViewが生成できます。あとは、アダプタクラスとして、どのクラスを生成するのか、生成の際に引数としてどのようなものを渡していくのか、という理解が必要になってきます。
今後も連載中にさまざまなListViewの生成方法と、アダプタクラスの使い方を紹介していこうと思います。
まとめ
今回は、ListViewのイベントとリスナについて、および、アクティビティ中でリストデータを生成する方法について解説しました。ListViewは奥が深く、さまざまな可能性があります。連載を通じて、いくつか紹介していこうと思います。
次回は、Androidの画面遷移とその中心的な役割をするインテントを紹介します。
