342 votes

Comment définir l'élément sélectionné de Spinner par valeur, pas par position?

J'ai une vue de mise à jour, où je dois présélectionner la valeur stockée dans la base de données pour un Spinner.

J'avais en tête quelque chose comme ça, mais l'adaptateur n'a pas de méthode indexOf, donc je suis coincé.

 void setSpinner(String value)
    {
        int pos=getSpinnerField().getAdapter().indexOf(value);
        getSpinnerField().setSelection(pos);
    }
 

706voto

Merrill Points 2476

Vous devez accéder directement à ArrayAdapter:

Supposons que votre Spinner soit nommé mySpinner , et que l'un de ses choix soit "une valeur".

Pour trouver la position de "value" dans Spinner, utilisez ceci:

 String myString = "some value"; //the value you want the position for

ArrayAdapter myAdap = (ArrayAdapter) mySpinner.getAdapter(); //cast to an ArrayAdapter

int spinnerPosition = myAdap.getPosition(myString);

//set the default according to value
mySpinner.setSelection(spinnerPosition);
 

157voto

Akhil Jain Points 3352

Un moyen simple de définir spinner en fonction de la valeur est

 mySpinner.setSelection(getIndex(mySpinner, myValue));

 //private method of your class
 private int getIndex(Spinner spinner, String myString)
 {
  int index = 0;

  for (int i=0;i<spinner.getCount();i++){
   if (spinner.getItemAtPosition(i).toString().equalsIgnoreCase(myString)){
    index = i;
    i=spinner.getCount();//will stop the loop, kind of break, by making condition false
   }
  }
  return index;
 } 
 

Le chemin du code complexe est déjà là, c'est beaucoup plus simple.

40voto

ArtOfWarfare Points 2345

Sur la base de la réponse de Merrill, je suis arrivé avec cette solution simple ligne ... ce n’est pas très joli, mais vous pouvez blâmer celui qui maintient le code de Spinner pour avoir négligé d’inclure une fonction qui fait cela pour cela.

 mySpinner.setSelection(((ArrayAdapter<String>)mySpinner.getAdapter()).getPosition(myString));
 

Vous aurez un avertissement sur la façon dont la conversion vers un ArrayAdapter <String> est décochée ... vraiment, vous pouvez utiliser un ArrayAdapter comme Merrill l'a fait, mais cela échange simplement un avertissement pour un autre.

36voto

mbaird Points 31293

Je conserve une ArrayList distincte de tous les éléments de mes Spinners. De cette façon, je peux faire indexOf sur ArrayList, puis utiliser cette valeur pour définir la sélection dans Spinner.

7voto

max4ever Points 2420

Sur la base de la réponse de Merrill, voici comment faire avec un CursorAdapter

 CursorAdapter myAdapter = (CursorAdapter) spinner_listino.getAdapter(); //cast
    for(int i = 0; i < myAdapter.getCount(); i++)
    {
        if (myAdapter.getItemId(i) == ordine.getListino() )
        {
            this.spinner_listino.setSelection(i);
            break;
        }
    }
 

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