web-dev-qa-db-fra.com

Pourquoi ne peut-on pas ajouter/supprimer des éléments d'un ArrayAdapter?

J'utilise un ArrayAdapter<CharSequence> pour renseigner les éléments à répertorier dans un Android.widget.Spinner. Cela fonctionne bien.

Mais maintenant, je veux garder la liste des éléments dynamique, c’est-à-dire pouvoir ajouter/supprimer des éléments de la liste de sélection au moment de l’exécution. Cependant, lorsque j'appelle adapter.add(item) ou adapter.remove(item), j'obtiens toujours une UnsupportedOperationException, même si les Javadocs de la classe ArrayAdapter décrivent ces deux méthodes comme pouvant être utilisées exactement dans le but recherché.

Est-ce un bug vraiment non implémenté ou qu'est-ce qui me manque ici?

56
mmo

Vous avez probablement initialisé l'adaptateur avec un tableau Java simple (par exemple, String[]). Essayez d’utiliser quelque chose qui implémente l’interface Java.util.List (par exemple, ArrayList<String>).

118
CommonsWare

Je sais qu'il est tard mais une explication rapide: c'est parce que la méthode Arrays.asList (T ... array) renvoie la classe interne personnalisée nommée ArrayList qui est en lecture seule . Comme déjà dit, vous devez fournir une implication complète. par exemple. Java.util.ArrayList.

20
zeratul021

Voici le code source de ArrayAdapter#remove:

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

La seule chose qui peut créer une variable UnsupportedOperationException est la ligne dans le bloc else. Le problème est donc que la liste que vous utilisez ne permet pas de supprimer des éléments. Je suppose que vous utilisez un tableau. Essayez une ArrayList, par exemple.

edit: Alors oui, ce que Mark a dit ...

16
benvd

J'avais le même problème, mes données étaient enregistrées dans la ressource String Array. Je créais donc ArraAdapter avec createFromResource .
Le code suivant pour créer ArrayAdapter à partir de la ressource String Array a résolu le problème:

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

Dans votre classe d'adaptateur - Supprimer un élément

remove(position);
notifyDataSetChanged();

Ajouter un article - 

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

Vous utilisez probablement List dans votre ArrayAdapter class au lieu de ArrayList

Essayez de convertir votre tableau ou votre liste en ArrayList -

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