ArrayAdapter in ListView: UnsupportedOperationException kann nicht geändert werden

94

Ich versuche eine Liste mit Namen zu erstellen. Diese Liste sollte änderbar sein (Hinzufügen, Löschen, Sortieren usw.). Wenn ich jedoch versuchte, die Elemente im ArrayAdapter zu ändern, stürzte das Programm mit einem java.lang.UnsupportedOperationExceptionFehler ab. Hier ist mein Code:

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

Ich habe versucht, Methoden einzufügen, zu entfernen und zu löschen, und keine davon hat funktioniert. Würde mir jemand sagen, was ich falsch gemacht habe?

Ryan
quelle

Antworten:

282

Ich habe es selbst ausprobiert ... Ich habe festgestellt, dass es nicht funktioniert hat. Also habe ich den Quellcode von ArrayAdapter überprüft und das Problem herausgefunden. Der ArrayAdapter konvertiert das Array bei der Initialisierung durch ein Array in eine AbstractList (Liste), die nicht geändert werden kann.

Lösung Verwenden Sie ArrayList<String>stattdessen ein Array, während Sie den ArrayAdapter initialisieren.

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

Prost!

st0le
quelle
8
Ich danke dir sehr! Du hast mir Stunden der Frustration erspart. Würde es Ihnen etwas ausmachen, mir zu erklären, warum String [] nicht funktioniert hat?
Ryan
@ Ryan Sie können nicht in ein Array einfügen, Sie können in eine Liste, es sei denn, die Listenimplementierung erlaubt es nicht. Wenn sich Ihre Sicherungsdaten nicht ändern, können Sie mit ArrayAdapter eine speichereffizientere Technik verwenden.
Stephen Denne
@ st0le Welchen Unterschied macht es, wenn ich "new ArrayList <String> (Arrays.asList (Array))" oder nur "Arrays.asList (Array)" übergebe? Das erste funktioniert und das zweite nicht.
Golosovsky
1
@golosovsky, In der ersten erstellen Sie eine veränderbare Liste, in der zweiten erstellen Sie eine unveränderliche Liste. (kann nicht geändert werden, sobald er erstellt wurde)
st0le
3
Es ist 2016 und immer noch diese lächerliche Ausnahme, die in diesem speziellen Szenario ausgelöst wird.
Eido95