hyoromoのブログ

最近はVRSNS向けに作ったものについて書いています

ListViewでListの追加と削除

ListView で List の追加や削除をしたい場合の方法。

画面レイアウトと公開ソース

端末
このような画面構成になっており、[追加]ボタンが押されると List が下へ追加され、[削除]ボタンが押されると List が下から削除されます。
全体のソースは gist に置いておきます。以下ではソースの説明をしていきます。

Adapterのソース

ListStorage に List構成データを突っ込んで、それを使い回しています。
このクラスにGenericsを用いて ListData を設定していますが、これは各自でそのListを構成する際に必要な型を設定してください。
なおこのメソッドにある convertView がどう受け渡されるかは過去日記で書いてます。

private class AdapterEx extends ArrayAdapter<ListData> {
    private final LayoutInflater mInflater;

    public AdapterEx() {
        super(mContext, 0);
        mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    // 画面に表示される毎に呼び出される
    @Override
    final public View getView(int position, View convertView, ViewGroup parent) {
        ListStorage listStorage;
        View row = convertView;

        if (row == null) {
            // ウィジェットの型を定義
            row = mInflater.inflate(R.layout.row, parent, false);
            listStorage = new ListStorage();
            listStorage.image = (ImageView) row.findViewById(R.id.ImageView01);
            listStorage.text = (TextView) row.findViewById(R.id.TextView01);
            // 次回のために定義情報をTagへ格納しておく
            row.setTag(listStorage);
        } else {
            // Tagに格納していたウィジェットの定義情報を取得
            listStorage = (ListStorage) convertView.getTag();
        }

        // addされたListData情報を元にウィジェットに値を設定
        ListData listData = getItem(position);
        listStorage.image.setImageResource(listData.icon);
        listStorage.text.setText(listData.text);

        return row;
    }

    // 使い回し用クラス
    private class ListStorage {
        ImageView image;
        TextView text;
    }
}

List追加

switchをバラして追加機能だけ取り除きました。
ListData 情報を構成し、ArrayAdapterEx#add 引数に渡しています。先ほど、ArrayAdapterEx で Generics を用いて ListData型を定義していた訳がここにあります。

ListData data = new ListData();
data.icon = R.drawable.icon;
data.text = mData[添字];     // Stringデータを格納しているだけ
mAdapter.add(data);           // mAdapterはAdapterExのインスタンス変数

List削除

こちらもswitchをバラして削除機能だけ取り除きました。
削除対象の ListData を取り出して、remove の引数として渡せば削除されます。Adapter で保持しているデータ型が List なので、同じObjectを生成して引数に渡しても消えるハズ...ですが私が消せませんでした。

ListData data;
data = mAdapter.getItem(添字);
Adapter.remove(data);