Ответ 1
Вероятно, вы инициализировали адаптер с помощью простого массива Java (например, String[]
). Попробуйте использовать что-то, что реализует интерфейс java.util.List
(например, ArrayList<String>
).
Я использую ArrayAdapter<CharSequence>
для заполнения элементов для списка в android.widget.Spinner
. Это прекрасно работает.
Но теперь я хочу, чтобы список элементов был динамическим, т.е. я хочу иметь возможность добавлять/удалять элементы из списка выбора во время выполнения. Однако, когда я вызываю adapter.add(item)
или adapter.remove(item)
, я всегда получаю UnsupportedOperationException
, даже если Javadocs класса ArrayAdapter
описывают эти два метода как пригодные для использования именно для этой цели.
Является ли это ошибкой, действительно не реализована или что мне здесь не хватает?
Вероятно, вы инициализировали адаптер с помощью простого массива Java (например, String[]
). Попробуйте использовать что-то, что реализует интерфейс java.util.List
(например, ArrayList<String>
).
Я знаю это позже, но просто краткое объяснение: потому что метод Arrays.asList(T... array) возвращает пользовательский внутренний класс с именем ArrayList, который доступен только для чтения. Как уже говорилось, вам нужно предоставить полный имп. например 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. Поэтому проблема заключается в том, что список, который вы используете, не поддерживает удаление элементов. Я предполагаю, что вы используете массив. Например, попробуйте ArrayList.
edit: Итак, что сказал Марк...
У меня была такая же проблема, мои данные были сохранены в ресурсе 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)));
В вашем адаптере Класс - Удалить элемент
remove(position);
notifyDataSetChanged();
Добавить элемент -
adapter.add (newItem);
adapter.notifyDataSetChanged ();
Возможно, вы используете List в своем классе ArrayAdapter вместо ArrayList.
Попробуйте преобразовать массив или список в ArrayList -
new ArrayList<ClassType>(Arrays.asList(array));