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

J’utilise un ArrayAdapter pour remplir les éléments à lister dans un android.widget.Spinner . Cela fonctionne très bien.

Mais maintenant, je veux garder la liste des éléments dynamic, c’est-à-dire que je veux pouvoir append / 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 exception UnsupportedOperationException, même si les Javadocs de la classe ArrayAdapter décrivent ces deux méthodes comme étant utilisables exactement à cette fin.

Est-ce un bug, pas vraiment implémenté ou qu’est-ce qui me manque ici?

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

Je sais qu’il est tard mais juste une explication rapide: c’est parce que la méthode Arrays.asList (T … array) renvoie une classe interne personnalisée nommée ArrayList en lecture seule . Comme déjà dit, vous devez fournir des impl. par exemple java.util.ArrayList.

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

edit: Alors oui, ce que Mark a dit …

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

 Resources res = getResources(); Ssortingng[] cities = res.getSsortingngArray(R.array.cities_array); ArrayAdapter adapter = new ArrayAdapter( this, android.R.layout.simple_spinner_item, new ArrayList(Arrays.asList(cities))); 

Dans votre classe d’adaptateur – Supprimer un élément

 remove(position); notifyDataSetChanged(); 

Ajouter un article –

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

Vous utilisez probablement List dans votre classe ArrayAdapter au lieu de ArrayList .

Essayez de convertir votre tableau ou votre liste en ArrayList

 new ArrayList(Arrays.asList(array));