私は_ArrayAdapter<CharSequence>
_を使用して、_Android.widget.Spinner
_にリストする項目を追加しています。それはすべてうまくいきます。
しかし、今はアイテムのリストを動的に保ちたい、つまり、実行時に選択リストからアイテムを追加/削除できるようにしたい。ただし、adapter.add(item)
またはadapter.remove(item)
を呼び出すと、UnsupportedOperationException
クラスのJavadocがこれらの2つのメソッドを記述するにもかかわらず、常にArrayAdapter
を取得します。まさにその意図された目的のために使用可能である。
これはバグですか、実際には実装されていませんか、ここで何が欠けていますか?
おそらく、単純なJava配列(たとえば、String[]
)でアダプターを初期化しました。Java.util.List
インターフェイスを実装するもの(たとえば、ArrayList<String>
) 。
私はそれが遅いことを知っていますが、簡単な説明です:Arrays.asList(T ... array)メソッドがArrayListつまりread-onlyという名前のカスタム内部クラスを返すためです。すでに述べたように、完全な実装を提供する必要があります。例えばJava.util.ArrayList。
ArrayAdapter#remove
のソースコードは次のとおりです。
public void remove(T object) {
if (mOriginalValues != null) {
synchronized (mLock) {
mOriginalValues.remove(object);
}
} else {
mObjects.remove(object);
}
if (mNotifyOnChange) notifyDataSetChanged();
}
UnsupportedOperationException
をスローできるのは、else-blockの行だけです。問題は、使用しているリストがアイテムの削除をサポートしていないことです。私の推測では、配列を使用しています。たとえば、ArrayListを試してください。
編集:ええ、マークが言ったことは...
私は同じ問題を抱えていました、私のデータはリソース文字列配列に保存されていたので、createFromResourceでArraAdapterを作成していました。
リソースString ArrayからArrayAdapterを作成するための次のコードは、問題を解決しました。
Resources res = getResources();
String[] cities = res.getStringArray(R.array.cities_array);
ArrayAdapter<CharSequence> adapter = new ArrayAdapter(
this,
Android.R.layout.simple_spinner_item,
new ArrayList(Arrays.asList(cities)));
アダプタクラス-アイテムの削除
remove(position);
notifyDataSetChanged();
アイテムを追加-
adapter.add (newItem);
adapter.notifyDataSetChanged ();
おそらく、ArrayListの代わりにArrayAdapterクラスでListを使用しています。
配列またはリストをArrayListに変換してみてください-
new ArrayList<ClassType>(Arrays.asList(array));