web-dev-qa-db-fra.com

Comment mettre à jour un spinner dynamiquement?

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.

23
2Real

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);
22
AdamC

Il vous suffit d'appeler setAdapter () une seule fois et d'appeler adapter.notifyDataSetChanged () pour mettre à jour les données.

12
Robby Pond

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 )

10
Fifer Sheep

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.

8
Dharmendra

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();
4
Cristian

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);
1
codingForFun

Modifiez les données sous-jacentes et appelez notifyDataSetChanged () sur l'adaptateur.

   list.clear();
  list.add("A");
      list.add("B");
  dataAdapter.notifyDataSetChanged();
1
Kapil D

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();
0
no-name

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());
0
kgao

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.

0
toshkinl