J'ai essayé de mettre à jour mon spinner sous Android de manière dynamique, mais rien de ce que j'ai essayé n'a fonctionné.
C'est le code suivant que j'utilise pour mettre à jour le spinner.
typeList = dbAdapter.getList(); //array list with the values
adapter.notifyDataSetChanged();
groupSpinner.postInvalidate();
groupSpinner.setAdapter(adapter);
Les valeurs de typeList sont correctes mais elles ne sont pas mises à jour dans Spinner.
En fait, vous devez appeler clear/add sur l’adaptateur ou créer et définir un nouvel adaptateur. L'adaptateur ne conserve pas de référence à votre liste (il appelle uniquement toArray sur votre liste lors de la construction), il n'a donc aucun moyen de se mettre à jour.
dataAdapter = new ArrayAdapter<String>(this, Android.R.layout.simple_spinner_item, newStringList);
dataAdapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
spinnerCategory.setAdapter(dataAdapter);
Il vous suffit d'appeler setAdapter () une seule fois et d'appeler adapter.notifyDataSetChanged () pour mettre à jour les données.
Vous ne pouvez pas simplement modifier la List
d'origine puis appeler notifyDataSetChanged()
comme sur d'autres adaptateurs, car elle ne conserve pas la List
d'origine. Cependant, vous pouvez obtenir le même résultat en utilisant l'adaptateur lui-même, comme suit:
spinnerAdapter.clear();
spinnerAdapter.addAll(updatedListData);
spinnerAdapter.notifyDataSetChanged(); // optional, as the dataset change should trigger this by default
Basé sur une réponse de l'utilisateur392117 ( https://stackoverflow.com/a/38738734/1508887 )
Lorsque vous avez modifié des données dans votre liste et que vous souhaitez mettre à jour le spinner alors
Créez un nouvel objet de l'adaptateur et définissez cet adaptateur sur fileur. Cela fonctionnera bien.
Bonne chance.
Edit: vous devez également appeler notifyDataSetChanged () sur l'adaptateur.
Y a-t-il une faute de frappe ou quelque chose? Quelle est la différence entre dbAdapter
et adapter
. Si le spinner a déjà l'adaptateur, vous n'avez pas à le réaffecter. De plus, la seule chose à faire est de mettre à jour l'adaptateur et d'appeler la méthode notifyDataSetChanged
.
typeList = adapter.getList(); //array list with the values
// change the values, and then
adapter.notifyDataSetChanged();
Après avoir modifié vos données, vous devrez ajouter le code suivant:
typeList = dbAdapter.getList()
adapter = new ArrayAdapter<String>(v.getContext(),
Android.R.layout.simple_spinner_dropdown_item,typeList);
groupSpinner.setAdapter(adapter);
Modifiez les données sous-jacentes et appelez notifyDataSetChanged () sur l'adaptateur.
list.clear();
list.add("A");
list.add("B");
dataAdapter.notifyDataSetChanged();
L'utilisation de add/remove sur votre adaptateur et de notifyDataSetChanged () vous permet de ne plus avoir à créer de nouveaux adaptateurs.
Déclarez votre adaptateur global
ArrayAdapter<Object> adapter;
Lorsque vous ajoutez quelque chose à la liste d'objets à laquelle l'adaptateur est attaché (chaînes ou l'objet que vous utilisez), ajoutez une fonction d'ajout à l'adaptateur et appelez notifyDataSetChanged:
adaper.add(Object);
adapter.notifyDataSetChanged();
et lorsque vous supprimez un élément de la liste, ajoutez également:
adapter.remove(Object);
adapter.notifyDataSetChanged();
Apparemment, après avoir effectué typeList = dbAdapter.getList()
, la variable typeList
pointe vers une liste différente plutôt que celle que vous avez fournie à l'adaptateur à l'origine et l'adaptateur serait quelque peu confus.
Donc, vous devriez utiliser le code suivant:
typeList.clear();
typeList.addAll(dbAdapter.getList());
Lorsque vous configurez l'adaptateur de spinner, ajoutez
spinnerAdapter.setNotifyOnChange(true);
Dès lors, lorsque vous ajoutez de nouvelles données, elles seront automatiquement mises à jour.