Androidで何かを一覧表示する時によく使うリストビュー。
その中でも一番シンプルで検索したらよく出てくるsimple_list_item_1を使ったリストビューの使い方。
よく見かけるサンプルの方法と、そのまま使えるかもしれない簡単なサンプルを書いてみようと思います。(わかりやすいように、地方(地域)リストにしてみました。都道府県でも良かったけど数が多いので。)
よく見かけるサンプル
選択した行の内容をトーストするサンプルです。
レイアウト
レイアウトはListViewだけを配置します。idはlistViewにしました。
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/listView" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> </RelativeLayout>
コード
Stringの配列を使う簡単やり方で、よく見かけるコードです。
MainActivity.java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String[] items = { "北海道", "東北", "関東", "中部", "近畿", "中国", "四国", "九州" }; ListView lv = (ListView) findViewById(R.id.listView); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items); lv.setAdapter(adapter); lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ListView listView = (ListView) parent; String item = (String) listView.getItemAtPosition(position); Toast.makeText(getApplicationContext(), item, Toast.LENGTH_SHORT).show(); } }); }
実行結果
サンプルとしては良く見かけるが・・・
この作りのサンプルってネット上でも、おそらく本でも見かけると思うんですが実際アプリを作る時に使えるかって言うと、選択したアイテムは文字なので使えない気がする。
実際、自分の経験ですがJavaもAndroidアプリについても詳しくない状態で、このサンプルを見てやりたい動きを作るのは無理でした。
地方選択でコードを取得するサンプル
リスト表示された一覧から地方を一つ選択すると、その地方に対応したコードをトーストするサンプルです。
レイアウト
レイアウトは上のサンプルのレイアウトと全く同じなので省略します。
コード
上のサンプルではStringの配列を使うやり方でしたが、今回はArrayListを使います。
コードも保有するので、地方(地域)クラスを作ります。
public class Region { private int code; private String name; Region(int code, String name){ this.code = code; this.name = name; } public int getCode(){ return code; } public String getName(){ return name; } @Override public String toString(){ return String.valueOf(code) + ":" + name; } }
toString()をオーバーライドして、「地方コード:地方名」となるようにしました。
地方名だけで十分なら、toString()はreturn name;にすればOKです。
ArrayAdapterはtoString()を呼び出しているので、toString()のオーバーライドをしないと、
パッケージ名.クラス名.@ごちゃごちゃ
みたいなのがリスト表示されます。
MainActivity.java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); List<Region> regionList = new ArrayList(); regionList.add(new Region(1,"北海道")); regionList.add(new Region(2,"東北")); regionList.add(new Region(3,"関東")); regionList.add(new Region(4,"中部")); regionList.add(new Region(5,"近畿")); regionList.add(new Region(6,"中国")); regionList.add(new Region(7,"四国")); regionList.add(new Region(8,"九州")); ArrayAdapter<Region> adapter = new ArrayAdapter<Region>(this,android.R.layout.simple_list_item_1, regionList); ListView lv = (ListView) findViewById(R.id.listView); lv.setAdapter(adapter); lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ListView listView = (ListView) parent; Region region = (Region) listView.getItemAtPosition(position); Toast.makeText(getApplicationContext(), String.valueOf(region.getCode()), Toast.LENGTH_SHORT).show(); } }); }
実行結果
これなら使える
実際はassetsとかres/rawにregion.csvなんかを入れておいたり、SQLiteやJSONを使ったりしてデータを読み込んでセットすると思う。
【地方リスト】 → 【都道府県リスト】
の様な画面遷移をしたくて、都道府県リストは選択された地方のみを表示する場合は、
上のサンプルのトーストをやめて、インテントする時にコードを渡しておけば遷移先で受け取ったコードの地方のみを抽出して都道府県リストを表示できます。
Intent intent = new Intent(MainActivity.this,PrefectureActivity.class); intent.putExtra("RegionCode",region.getCode()); startActivity(intent);
まとめ
1行のテキストを表示するリストだったら最初から準備されているsimple_list_item_1が便利。
1行のテキストだったらわざわざ自分でレイアウトを作る必要もないと思う。
2行のテキスト(上がメインテキスト(文字大き目)、下がサブテキスト(文字小さ目))を表示するリストも最初からsimple_list_item_2と言うレイアウトが準備されている。
simple_list_item_2を使う方法は1より難しいと思うので、また今度。
コメント