web-dev-qa-db-ja.com

ArrayAdapterからアイテムを追加/削除できないのはなぜですか?

私は_ArrayAdapter<CharSequence>_を使用して、_Android.widget.Spinner_にリストする項目を追加しています。それはすべてうまくいきます。

しかし、今はアイテムのリストを動的に保ちたい、つまり、実行時に選択リストからアイテムを追加/削除できるようにしたい。ただし、adapter.add(item)またはadapter.remove(item)を呼び出すと、UnsupportedOperationExceptionクラスのJavadocがこれらの2つのメソッドを記述するにもかかわらず、常にArrayAdapterを取得します。まさにその意図された目的のために使用可能である。

これはバグですか、実際には実装されていませんか、ここで何が欠けていますか?

57
mmo

おそらく、単純なJava配列(たとえば、String[])でアダプターを初期化しました。Java.util.Listインターフェイスを実装するもの(たとえば、ArrayList<String>) 。

119
CommonsWare

私はそれが遅いことを知っていますが、簡単な説明です:Arrays.asList(T ... array)メソッドがArrayListつまりread-onlyという名前のカスタム内部クラスを返すためです。すでに述べたように、完全な実装を提供する必要があります。例えばJava.util.ArrayList。

21
zeratul021

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を試してください。

編集:ええ、マークが言ったことは...

16
benvd

私は同じ問題を抱えていました、私のデータはリソース文字列配列に保存されていたので、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)));
13
user1063503

アダプタクラス-アイテムの削除

remove(position);
notifyDataSetChanged();

アイテムを追加-

adapter.add (newItem);
adapter.notifyDataSetChanged ();
3
Tom

おそらく、ArrayListの代わりにArrayAdapterクラスでListを使用しています。

配列またはリストをArrayListに変換してみてください-

new ArrayList<ClassType>(Arrays.asList(array));
0
Prince Bhardwaj