webentwicklung-frage-antwort-db.com.de

Warum kann man keine Elemente zu einem ArrayAdapter hinzufügen oder daraus entfernen?

Ich verwende einen ArrayAdapter<CharSequence>, um die Elemente in einem Android.widget.Spinner aufzulisten. Das funktioniert alles gut.

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/daraus zu entfernen. Wenn ich jedoch adapter.add(item) oder adapter.remove(item) anrufe, erhalte ich immer eine UnsupportedOperationException, auch wenn die Javadocs der ArrayAdapter-Klasse diese beiden Methoden so beschreiben, dass sie genau für diesen beabsichtigten Zweck verwendbar sind.

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

56
mmo

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

118
CommonsWare

Ich weiß, es ist spät, aber nur eine kurze Erklärung: Dies liegt daran, dass die Methode Arrays.asList (T ... array) eine benutzerdefinierte innere Klasse mit dem Namen ArrayList das heißt schreibgeschützt zurückgibt. Wie bereits gesagt, müssen Sie vollständige Angaben machen. z.B. Java.util.ArrayList.

20
zeratul021

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 eine UnsupportedOperationException dort werfen kann, ist die Zeile im else-Block. Das Problem ist also, dass die von Ihnen verwendete Liste das Entfernen von Elementen nicht unterstützt. Meine Vermutung ist, dass Sie ein Array verwenden. Versuchen Sie beispielsweise eine ArrayList.

edit: Also ja, was Mark gesagt hat ...

16
benvd

Ich hatte das gleiche Problem, meine Daten wurden im Ressourcen-String-Array gespeichert, also erstellte ich ArraAdapter mit createFromResource .
Der folgende Code zum Erstellen von ArrayAdapter aus dem Ressourcen-String-Array hat das Problem gelöst:

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

In Ihrer Adapterklasse - Element löschen

remove(position);
notifyDataSetChanged();

Artikel hinzufügen - 

adapter.add (newItem);
adapter.notifyDataSetChanged ();
3
Tom

Wahrscheinlich verwenden Sie List in Ihrer ArrayAdapter Klasse anstelle von ArrayList

Konvertieren Sie Ihr Array oder Ihre Liste in ArrayList -.

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