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);