Android, ListView に複数のデータを割り当てる
2010年09月02日
Android のリスト表示用 UI の ListView
で、リスト項目名としての表示用データと内部で保持する非表示データを合せ持たせる方法のメモ。
今回は、都道府県名(文字列)と都道府県コード番号(整数)の2つのデータを保持するリストを作成し、ListView
にデータバインドさせる。
ListView
で表示されるのは都道府県名のみで、リストをクリックした時に Toast
で都道府県名と都道府県コードの両方をポップアップさせる。
まず、内部クラスで都道府県名と都道府県コード番号を管理するクラス Area
を作成する。
private class Area { private String AreaName; private int AreaCode; public Area(String name, int code) { this.AreaName = name; this.AreaCode = code; } public String getName() { return AreaName; } public int getCode() { return AreaCode; } }
Area
クラスのインスタンスのリストデータを BaseAdapter
を継承して作った AreaListAdapter
を使って ListView
にバインドさせる。
AreaListAdapter
では、1行分のリストをレイアウトファイル list_item.xml で定義したレイアウトに従って表示させる。
private class AreaListAdapter extends BaseAdapter { private Context context; private List<Area> list; private LayoutInflater layoutInflater = null; public AreaListAdapter(Context context, List<Area> list) { super(); this.context = context; this.list = list; layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { Area area = (Area) getItem(position); convertView = layoutInflater.inflate(R.layout.list_item, null); TextView tv = (TextView) convertView.findViewById(R.id.list_item); tv.setText(area.getName()); return convertView; } }
レイアウトファイル list_item.xml
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/list_item" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="22.5sp" android:textColor="#ffffffff" android:padding="12.5dip" />
アクティビティ生成時にデータを作成して、AreaListAdapter
を使って ListView
にデータをセットする。
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); List<Area> list = new ArrayList<Area>(); String[] areaNames = { "東京", "大阪", "福岡" }; int [] areaCodes = { 100, 102, 105 }; for (int i = 0; i < areaNames.length; i++) { list.add(new Area(areaNames[i], areaCodes[i])); } setListAdapter(new AreaListAdapter(this, list)); }
ListView
で表示される項目をクリックした際には、View
に紐付けられているアダプタを取得してデータ(Area
クラス)を取り出し、都道府県名と都道府県コードのデータを得る。
@Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); Area item = (Area) l.getAdapter().getItem(position); Toast.makeText(this, "AreaName : " + item.getName() + ", AreaCode : " + item.getCode(), Toast.LENGTH_SHORT).show(); }
ListActivity
を使って画面を作成したので、main.xml ファイルに ListView
を定義して ListView
の id
を @+id/android:list
としておく。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:id="@+id/android:list" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>
実行画面スクリーンショット
Google Androidプログラミング入門
posted with amazlet at 10.09.02
江川 崇 竹端 進 山田 暁通 麻野 耕一 山岡 敏夫 藤井 大助 藤田 泰介 佐野 徹郎
アスキー・メディアワークス
売り上げランキング: 2687
アスキー・メディアワークス
売り上げランキング: 2687