2010-08-13 6 views
55

Я использую ArrayAdapter<CharSequence> для заполнения элементов, которые нужно перечислить в android.widget.Spinner. Все работает отлично.Почему нельзя добавлять/удалять элементы из ArrayAdapter?

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

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

+1

Я думаю, что фрагмент кода может помочь. –

+0

Duplicate of [Невозможно изменить ArrayAdapter в ListView] (http://stackoverflow.com/questions/3200551/unable-to-modify-arrayadapter-in-listview) – blahdiblah

ответ

118

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

+3

Я использую ArrayList

и получаю 'UnsupportedOperationException' , Форма - это особый класс. – VansFannel

+10

Это должен быть принятый ответ. –

+2

За исключением случаев использования Arrays.asList, который возвращает только ArrayList для чтения.См. Ответ Зератула ниже – andrei

16

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

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

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

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

20

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

12

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

Это сработало и для меня. Благодаря! – Malu

3

В вашем адаптере Class - удалить элемент

remove(position); 
notifyDataSetChanged(); 

Добавить товар -

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

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

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

new ArrayList<ClassType>(Arrays.asList(array)); 
Смежные вопросы