Подтвердить что ты не робот

Почему нельзя добавлять/удалять элементы из ArrayAdapter?

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

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

Является ли это ошибкой, действительно не реализована или что мне здесь не хватает?

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

Здесь исходный код 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.

edit: Итак, что сказал Марк...

Ответ 4

У меня была такая же проблема, мои данные были сохранены в ресурсе String Array, поэтому я создал 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)));

Ответ 5

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

remove(position);
notifyDataSetChanged();

Добавить элемент -

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

Ответ 6

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

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

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