Android, ListView に複数のデータを割り当てる

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 を定義して ListViewid@+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>

実行画面スクリーンショット

Android, ListView データバインディング サンプル Screenshot


Google Androidプログラミング入門
江川 崇 竹端 進 山田 暁通 麻野 耕一 山岡 敏夫 藤井 大助 藤田 泰介 佐野 徹郎
アスキー・メディアワークス
売り上げランキング: 2687
«
»