2010-08-13 7 views
55

Ich verwende eine ArrayAdapter<CharSequence>, um die Elemente aufzulisten, die in einer android.widget.Spinner aufgelistet werden sollen. Das funktioniert ganz gut.Warum kann man keine Elemente aus einem ArrayAdapter hinzufügen/entfernen?

Aber jetzt möchte ich die Liste der Elemente dynamisch halten, d. H. Ich möchte in der Lage sein, Elemente zur Laufzeit zur Auswahlliste hinzuzufügen/zu entfernen. Jedoch, wenn ich oder adapter.remove(item) rufe, bekomme ich immer eine UnsupportedOperationException, obwohl die Javadocs der ArrayAdapter Klasse diese zwei Methoden beschreiben, um für genau diesen beabsichtigten Zweck verwendbar zu sein.

Ist das ein Bug, wirklich nicht implementiert oder was fehlt mir hier?

+1

ich helfen könnte ein Ausschnitt denken. –

+0

Duplikat von [Kann ArrayAdapter in ListView nicht ändern] (http://stackoverflow.com/questions/3200551/unable-to-modify-arrayadapter-in-listview) – blahdiblah

Antwort

118

Sie haben den Adapter wahrscheinlich mit einem einfachen Java-Array initialisiert (z. B. String[]). Versuchen Sie, etwas zu verwenden, das die Schnittstelle java.util.List implementiert (z. B. ArrayList<String>).

+3

Ich benutze eine ArrayList

und ich bekomme 'UnsupportedOperationException' . Form ist eine benutzerdefinierte Klasse. – VansFannel

+10

Dies sollte die akzeptierte Antwort sein. –

+2

Außer bei der Verwendung von Arrays.asList, die eine schreibgeschützte ArrayList zurückgibt.Siehe Zeratuls Antwort unter – andrei

16

Hier ist der Quellcode von ArrayAdapter#remove:

public void remove(T object) { 
    if (mOriginalValues != null) { 
     synchronized (mLock) { 
      mOriginalValues.remove(object); 
     } 
    } else { 
     mObjects.remove(object); 
    } 
    if (mNotifyOnChange) notifyDataSetChanged(); 
} 

Das einzige, was ein UnsupportedOperationException werfen kann, gibt es die Zeile in der Else-Block. Das Problem besteht also darin, dass die von Ihnen verwendete Liste das Entfernen von Elementen nicht unterstützt. Meine Vermutung ist, dass Sie ein Array verwenden. Probieren Sie zum Beispiel eine ArrayList aus.

edit: Also ja, was Mark sagte ...

20

Ich weiß, es ist spät, aber nur eine kurze Erklärung: es ist, weil Methode Arrays.asList (T ... Array) individuelle innere Klasse gibt benannt ArrayList das ist schreibgeschützt. Wie bereits gesagt, musst du den vollen Impl bereitstellen. z.B. java.util.ArrayList.

12

Ich hatte das gleiche Problem, meine Daten wurden in der Ressource String Array gespeichert, so dass ich ArraAdapter mit createFromResource erstellt habe.
Der folgende Code ArrayAdapter von Ressourcen String Array löste das Problem für die Erstellung von:

Resources res = getResources(); 
String[] cities = res.getStringArray(R.array.cities_array); 
ArrayAdapter<CharSequence> adapter = new ArrayAdapter(
    this, 
    android.R.layout.simple_spinner_item, 
    new ArrayList(Arrays.asList(cities))); 
+0

Das hat auch für mich funktioniert. Vielen Dank! – Malu

3

In Ihrem Adapter-Klasse -

adapter.add (newItem); 
adapter.notifyDataSetChanged(); 
0

Wahrscheinlich -

remove(position); 
notifyDataSetChanged(); 

fügen Sie ein Element ein Element löschen , verwenden Sie die Liste in Ihrem ArrayAdapter Klasse statt ArrayList.

Versuchen Sie Ihr Array oder eine Liste zu Arraylist Umwandlung -

new ArrayList<ClassType>(Arrays.asList(array));