Невозможно изменить ArrayAdapter в ListView: UnsupportedOperationException

95

Я пытаюсь составить список, содержащий имена. Этот список должен быть изменяемым (добавлять, удалять, сортировать и т. Д.). Однако всякий раз, когда я пытался изменить элементы в ArrayAdapter, программа вылетала из строя с java.lang.UnsupportedOperationExceptionошибкой. Вот мой код:

ListView panel = (ListView) findViewById(R.id.panel);
String[] array = {"a","b","c","d","e","f","g"};
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, array);
adapter.setNotifyOnChange(true);
panel.setAdapter(adapter);

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
      adapter.insert("h", 7);
   }
});

Я пробовал вставлять, удалять и очищать методы, но ни один из них не работал. Кто-нибудь скажет мне, что я сделал не так?

Райан
источник

Ответы:

283

Я сам пробовал ... Обнаружил, что не работает. Итак, я проверил исходный код ArrayAdapter и обнаружил проблему. ArrayAdapter при инициализации массивом преобразует массив в AbstractList (List), который нельзя изменить.

Решение Используйте ArrayList<String>вместо этого массив при инициализации ArrayAdapter.

String[] array = {"a","b","c","d","e","f","g"}; 
ArrayList<String> lst = new ArrayList<String>(Arrays.asList(array));
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
android.R.layout.simple_list_item_1, lst); 

Ура!

st0le
источник
8
Спасибо вам большое! Вы сэкономили мне часы разочарования. Не могли бы вы объяснить мне, почему String [] не работает?
Райан
@Ryan вы не можете вставить в массив, вы можете в список, если реализация списка не позволяет этого. Если ваши резервные данные не собираются меняться, ArrayAdapter позволяет использовать более эффективный метод памяти.
Стивен Денн
@ st0le какая разница, если я передам «new ArrayList <String> (Arrays.asList (array))» или просто «Arrays.asList (array)»? Первый работает, а второй нет.
Голосовский
1
@golosovsky, в первом вы создаете изменяемый список, второй способ создает неизменяемый список. (невозможно изменить после создания)
st0le 09
3
На дворе 2016 год, а это нелепое исключение выброшено в этот конкретный сценарий.
Eido95