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?
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>
).
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.
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 ...
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)));
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 ArrayAdapter class au lieu de ArrayList .
Essayez de convertir votre tableau ou votre liste en ArrayList -
new ArrayList<ClassType>(Arrays.asList(array));