Nie można zmodyfikować ArrayAdapter w ListView: UnsupportedOperationException

95

Próbuję zrobić listę zawierającą nazwiska. Ta lista powinna być modyfikowalna (dodawanie, usuwanie, sortowanie itp.). Jednak za każdym razem, gdy próbowałem zmienić elementy w ArrayAdapter, program zawieszał się z java.lang.UnsupportedOperationExceptionbłędem. Oto mój kod:

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);
   }
});

Próbowałem wstawiać, usuwać i czyścić metody, ale żadna z nich nie działała. Czy ktoś mi powie, co zrobiłem źle?

Ryan
źródło

Odpowiedzi:

283

Sam go wypróbowałem ... Okazało się, że nie działa. Więc sprawdziłem kod źródłowy ArrayAdapter i znalazłem problem. ArrayAdapter, po zainicjowaniu przez tablicę, konwertuje tablicę na AbstractList (List), której nie można modyfikować.

Roztwór Użyć ArrayList<String>zamiast za pomocą tablicy podczas inicjowania 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); 

Twoje zdrowie!

st0le
źródło
8
Dziękuję bardzo! Zaoszczędziłeś mi godzin frustracji. Czy możesz mi wyjaśnić, dlaczego String [] nie działa?
Ryan
@Ryan nie możesz wstawić do tablicy, możesz do listy, chyba że implementacja listy na to nie pozwala. Jeśli dane zapasowe nie ulegną zmianie, ArrayAdapter pozwala na użycie techniki bardziej wydajnej pamięci.
Stephen Denne,
@ st0le, jaka to różnica, jeśli przekażę „new ArrayList <String> (Arrays.asList (tablica))” lub po prostu „Arrays.asList (tablica)”? Pierwsza działa, a druga nie.
golosovsky
1
@golosovsky, W pierwszym z nich tworzysz listę mutowalną, w drugim tworzysz listę niezmienną. (nie można zmodyfikować po utworzeniu)
st0le
3
Jest rok 2016 i wciąż ten śmieszny wyjątek rzucony w tym konkretnym scenariuszu.
Eido95,