Неможливо змінити ArrayAdapter у ListView: UnsupportedOperationException


94

Я намагаюся скласти список, що містить імена. Цей список слід змінювати (додавати, видаляти, сортувати тощо). Однак, коли я намагався змінити елементи в 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);
   }
});

Я спробував вставити, видалити та очистити методи, і жоден з них не працював. Хтось сказав би мені, що я зробив неправильно?

Відповіді:


282

Я спробував це сам ... виявив, що це не спрацювало. Тож я перевірив вихідний код 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); 

Ура!


8
Дуже дякую! Ти врятував мені години розчарування. Не могли б ви пояснити мені, чому String [] не працював?
Райан

@Ryan ви не можете вставити в масив, ви можете у список, якщо тільки реалізація списку цього не дозволяє. Якщо ваші резервні дані не збираються змінюватись, ArrayAdapter дозволяє використовувати більш ефективний прийом пам'яті.
Stephen Denne

@ st0le, яка різниця, якщо я передаю "new ArrayList <String> (Arrays.asList (array))" або просто "Arrays.asList (array)"? Перший працює, а другий ні.
голосовський

1
@golosovsky, У першому ви створюєте змінний список, другий спосіб створює незмінний список. (не може бути змінено після створення)
st0le

3
Це 2016 рік, і все ще цей безглуздий виняток, вироблений за цим конкретним сценарієм.
Eido95,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.