Почему нельзя добавить / удалить элементы из ArrayAdapter? - PullRequest
56 голосов
/ 13 августа 2010

Я использую ArrayAdapter<CharSequence> для заполнения пунктов списка в android.widget.Spinner. Все отлично работает.

Но теперь я хочу сохранить список элементов динамическим, то есть я хочу иметь возможность добавлять / удалять элементы из списка выбора во время выполнения. Однако, когда я вызываю adapter.add(item) или adapter.remove(item), я всегда получаю UnsupportedOperationException, хотя Javadocs класса ArrayAdapter описывают эти два метода как пригодные для использования именно для этой цели.

Это ошибка, действительно не реализованная или что я здесь упускаю?

Ответы [ 6 ]

118 голосов
/ 13 августа 2010

Возможно, вы инициализировали адаптер с простым массивом Java (например, String[]).Попробуйте использовать что-то, что реализует интерфейс java.util.List (например, ArrayList<String>).

20 голосов
/ 26 августа 2011

Я знаю, что уже поздно, но только краткое объяснение: это потому, что метод Arrays.asList (T ... array) возвращает собственный внутренний класс с именем ArrayList , который только для чтения .Как уже говорилось, вам нужно предоставить полный импл.например, java.util.ArrayList.

16 голосов
/ 13 августа 2010

Вот исходный код ArrayAdapter#remove:

public void remove(T object) {
    if (mOriginalValues != null) {
        synchronized (mLock) {
            mOriginalValues.remove(object);
        }
    } else {
        mObjects.remove(object);
    }
    if (mNotifyOnChange) notifyDataSetChanged();
}

Единственное, что может бросить UnsupportedOperationException, это строка в блоке else. Поэтому проблема в том, что используемый вами список не поддерживает удаление элементов. Я предполагаю, что вы используете массив. Попробуйте, например, ArrayList.

редактировать: да, что сказал Марк ...

12 голосов
/ 15 июня 2012

У меня была та же проблема, мои данные были сохранены в массиве ресурсов String, поэтому я создавал ArraAdapter с createFromResource .
Следующий код для создания ArrayAdapter из ресурса String Array решил проблему:

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)));
3 голосов
/ 10 сентября 2012

В вашем адаптере Класс - Удалить элемент

0 голосов
/ 08 ноября 2017

Возможно, вы используете List в вашем ArrayAdapter классе вместо ArrayList .

Попробуйте преобразовать ваш массив или список в ArrayList -

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