Impossibile modificare ArrayAdapter in ListView: UnsupportedOperationException


94

Sto cercando di creare un elenco contenente i nomi. Questo elenco dovrebbe essere modificabile (aggiungi, elimina, ordina, ecc.). Tuttavia, ogni volta che ho provato a modificare gli elementi nell'ArrayAdapter, il programma si è bloccato, con java.lang.UnsupportedOperationExceptionerrore. Ecco il mio codice:

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

Ho provato a inserire, rimuovere e cancellare i metodi e nessuno di loro ha funzionato. Qualcuno potrebbe dirmi cosa ho sbagliato?

Risposte:


282

L'ho provato io stesso ... Ho scoperto che non funzionava. Quindi ho controllato il codice sorgente di ArrayAdapter e ho scoperto il problema. ArrayAdapter, una volta inizializzato da un array, converte l'array in un AbstractList (List) che non può essere modificato.

Soluzione Utilizzare ArrayList<String>invece un array durante l'inizializzazione di 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); 

Saluti!


8
Grazie mille! Mi hai risparmiato ore di frustrazione. Mi spiegheresti perché String [] non ha funzionato?
Ryan

@ Ryan non puoi inserire in un array, puoi farlo in un elenco, a meno che l'implementazione dell'elenco non lo consenta. Se i tuoi dati di supporto non cambieranno, ArrayAdapter ti consente di utilizzare una tecnica più efficiente in termini di memoria.
Stephen Denne

@ st0le che differenza fa se passo "new ArrayList <String> (Arrays.asList (array))" o semplicemente "Arrays.asList (array)"? Il primo funziona e il secondo no.
golosovsky

1
@golosovsky, nel primo crei un elenco mutabile, il secondo modo crea un elenco immutabile. (non può essere modificato una volta creato)
dal

3
È il 2016 ed è ancora questa ridicola eccezione lanciata a questo specifico scenario.
Eido95
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.