57 votes

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

Je suis en utilisant un ArrayAdapter<CharSequence> pour remplir les éléments de liste dans android.widget.Spinner. Que de toutes les œuvres de bien.

Mais maintenant, je veux garder la liste des éléments dynamiques, c'est à dire je veux être en mesure d'ajouter ou de supprimer des éléments de la liste de sélection au moment de l'exécution. Cependant, quand je l'appelle adapter.add(item) ou adapter.remove(item) je reçois toujours un UnsupportedOperationException, même si la documentation Javadoc de l' ArrayAdapter classe de décrire ces deux méthodes pour être utilisable pour exactement cet objectif.

Est-ce un bug, vraiment pas mis en œuvre ou ce qui me manque ici?

120voto

CommonsWare Points 402670

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

22voto

Zeratul Points 1253

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.

16voto

benvd Points 2795

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 jeter un UnsupportedOperationException là est la ligne dans le bloc else. Le problème est donc que la liste que vous utilisez ne prend pas en charge la suppression d'éléments. Je suppose que vous utilisez un tableau. Essayez une ArrayList, par exemple.

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

13voto

user1063503 Points 91

J'avais le même problème, mes données étaient sauvegardé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)));
 

2voto

Tom Points 1463

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

 remove(position);
notifyDataSetChanged();
 

Ajouter un article -

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X