Définir l'élément sélectionné du spinner par programme

384

Je travaille sur un projet Android et j'utilise un spinner qui utilise un adaptateur de tableau qui est rempli à partir de la base de données.

Je ne peux pas savoir comment définir par programmation l'élément sélectionné dans la liste. Par exemple si, dans le spinner, j'ai les éléments suivants:

  • Catégorie 1
  • Catégorie 2
  • Catégorie 3

Comment pourrais-je faire de la catégorie 2 par programme l'élément sélectionné lors de la création de l'écran. Je pensais que cela pourrait être similaire à c # IE Spinner.SelectedText = "Catégorie 2" mais il ne semble pas y avoir de méthode similaire à celle-ci pour Android.

Boardy
la source
Veuillez suivre ce lien: [Comment définir la sélection sur un objet spinner] [1] [1]: stackoverflow.com/questions/16358563/…
Maddy
1
Vous pouvez transmettre votre index spinner.setSelection(). Cela fonctionnerait très bien. Vous pouvez également créer une méthode qui peut vous aider à faire correspondre vos index à leurs chaînes réelles.
Taslim Oseni

Réponses:

737

Utilisez ce qui suit: spinnerObject.setSelection(INDEX_OF_CATEGORY2).

Arun George
la source
287
Merci, cela a très bien fonctionné, alors que je faisais cela, j'ai également trouvé un moyen d'obtenir l'index sans avoir à parcourir l'adaptateur. J'ai utilisé ce qui suitmySpinner.setSelection(arrayAdapter.getPosition("Category 2"));
Boardy
86
au cas où vous n'auriez pas l'adaptateur à référencer. mySpinner.setSelection ((((ArrayAdapter) mySpinner.getAdapter ()). getPosition ("Value"));
Kalel Wade
3
sexSpinner.setSelection (adapter.getPosition (mUser.getGender ()) == -1? 0: adapter.getPosition (mUser.getGender ()));
Goofyahead
appeler SetSelection () juste après setAdapter () semble afficher toujours le 1er élément (Android 2.3), même le bon est sélectionné dans le dropView. l'ajout de view.post () (@Marco Hernaiz Cao answer) le corrige pour moi.
Christ
3
Cela ne fonctionne pas si le Spinner a un onItemSelectedListener (). L'auditeur ne sera pas appelé.
Don Larynx
80

Aucune de ces réponses ne m'a donné la solution, a seulement fonctionné avec ceci:

mySpinner.post(new Runnable() {
    @Override
    public void run() {
        mySpinner.setSelection(position);
    }
});
Marco HC
la source
3
J'appelle SetSelection () juste après setAdapter (). Cela affiche toujours le 1er élément (Android 2.3), même le bon est sélectionné dans le dropView. Votre solution l'a fait pour moi.
Christ
2
Merci, ça a marché! btw fonctionne également pour ListView.post.run () performItemClick ()
Michael D.
Comment puis-je sélectionner le dernier en fonction de la taille?
jvargas
41
public static void selectSpinnerItemByValue(Spinner spnr, long value) {
    SimpleCursorAdapter adapter = (SimpleCursorAdapter) spnr.getAdapter();
    for (int position = 0; position < adapter.getCount(); position++) {
        if(adapter.getItemId(position) == value) {
            spnr.setSelection(position);
            return;
        }
    }
}

Vous pouvez utiliser ce qui précède comme:

selectSpinnerItemByValue(spinnerObject, desiredValue);

& bien sûr, vous pouvez également sélectionner par index directement comme

spinnerObject.setSelection(index);
Yaqub Ahmad
la source
Une erreur avec ce code est que @Boardy veut la sélection Category 2dont je suppose qu'il s'agit d'une chaîne (en supposant qu'il a essayé d'utiliser Spinner.SelectedText = "Category 2") mais le code ci-dessus est pour a long.
Arun George
Il remplit les catégories de la base de données, il doit y avoir un identifiant pour chaque catégorie.
Yaqub Ahmad
1
Pourquoi supposer que c'est un CursorAdapter? SpinnerAdapter fonctionne aussi bien.
Greg Ennis
Je pense que vous avez une erreur ici, elle devrait l'être adapter.getItem(position), non adapter.getItemId(position).
Vadim Kotov
29

Quelques explications (au moins pour les fragments - jamais essayées avec une activité pure). J'espère que cela aidera quelqu'un à mieux comprendre Android.

La réponse la plus populaire d' Arun George est correcte mais ne fonctionne pas dans certains cas.
La réponse de Marco HC utilise Runnable qui est un dernier recours en raison de la charge supplémentaire du processeur.

La réponse est - vous devez simplement choisir le bon endroit pour appeler à setSelection () , par exemple, cela fonctionne pour moi:

@Override
public void onResume() {
    super.onResume();

    yourSpinner.setSelection(pos);
 }

Mais cela ne fonctionnera pas dans onCreateView () . Je soupçonne que c'est la raison de l'intérêt pour ce sujet.

Le secret est qu'avec Android, vous ne pouvez pas faire ce que vous voulez dans n'importe quelle méthode - oups :( - les composants peuvent ne pas être prêts. Comme autre exemple - vous ne pouvez pas faire défiler ScrollView ni dans onCreateView () ni dans onResume () ( voir la réponse ici )

sberezin
la source
Merci - je ne savais pas que Fragments avait la méthode onResume.
ToolmakerSteve
Je vais donner un +18 pour que votre réponse soit au-dessus de @Marco HC. Vous êtes le seul à essayer de faire les choses comme cela est censé être fait
vedant
15

Pour rechercher une valeur et la sélectionner:

private void selectValue(Spinner spinner, Object value) {
    for (int i = 0; i < spinner.getCount(); i++) {
        if (spinner.getItemAtPosition(i).equals(value)) {
            spinner.setSelection(i);
            break;
        }
    }
}
Ferran Maylinch
la source
12

Pourquoi n'utilisez-vous pas vos valeurs de la base de données et les stockez sur une liste de tableaux, puis utilisez simplement:

yourSpinner.setSelection(yourArrayList.indexOf("Category 1"));
RicardoSousaDev
la source
1
Les différentes solutions utilisant DataAdapter n'ont pas fonctionné pour moi, mais l'utilisation de ArrayList à partir de laquelle les valeurs ont été construites dans cet exemple a fait l'affaire.
ewall
8

La solution optimale est:

    public String[] items= new String[]{"item1","item2","item3"};
    // here you can use array or list 
    ArrayAdapter adapter= new ArrayAdapter(Your_Context, R.layout.support_simple_spinner_dropdown_item, items);
    final Spinner itemsSpinner= (Spinner) findViewById(R.id.itemSpinner);
itemsSpinner.setAdapter(adapter);

Pour obtenir la position de l'élément, ajoutez automatiquement l'instruction suivante

itemsSpinner.setSelection(itemsSpinner.getPosition("item2"));
Naham Al-Zuhairi
la source
7

Vous pouvez faire une méthode générique pour ce genre de travail comme je le fais dans ma UtilityClass qui est

public void SetSpinnerSelection(Spinner spinner,String[] array,String text) {
    for(int i=0;i<array.length;i++) {
        if(array[i].equals(text)) {
            spinner.setSelection(i);
        }
    }
}
ZygoteInit
la source
5

Vous pouvez facilement définir comme ceci: spinner.setSelection(1)au lieu de 1, vous pouvez définir n'importe quelle position de liste que vous souhaitez afficher.

Vadim Kotov
la source
4

J'ai un SimpleCursorAdapter donc je dois dupliquer les données pour utiliser la réponse dans ce post. Donc, je vous recommande d'essayer de cette façon:

for (int i = 0; i < spinnerRegion.getAdapter().getCount(); i++) {
    if (spinnerRegion.getItemIdAtPosition(i) == Integer
        .valueOf(signal.getInt(signal
            .getColumnIndexOrThrow("id_region")))) {
        spinnerRegion.setSelection(i);
        break;
    }
}

Je pense que c'est une vraie façon

pazfernando
la source
1
oui, dans le cas de SimpleCursorAdapter, spinnerRegion.getItemIdAtPosition (i) donne un curseur, qui peut être utilisé pour obtenir les colonnes.
lalitm
3

C'est du travail pour moi.

 spinner.setSelection(spinner_adapter.getPosition(selected_value)+1);
Arpit Patel
la source
qu'en est-il du +1?
SHADOW.NET
Parce que c'est à partir de 0, nous devons donc en ajouter un pour obtenir la bonne réponse
Arpit Patel
2

Si vous avez une liste de contacts, vous pouvez y aller:

((Spinner) view.findViewById(R.id.mobile)).setSelection(spinnerContactPersonDesignationAdapter.getPosition(schoolContact.get(i).getCONT_DESIGNATION()));
Maddy
la source
2

Je sais que c'est déjà répondu, mais code simple pour sélectionner un élément, très simple:

spGenre.setSelection( ( (ArrayAdapter) spGenre.getAdapter()).getPosition(client.getGenre()) );
Dante
la source
2
  for (int x = 0; x < spRaca.getAdapter().getCount(); x++) {
            if (spRaca.getItemIdAtPosition(x) == reprodutor.getId()) {
                spRaca.setSelection(x);
                break;
            }
        }
Julio Cezar Riffel
la source
4
Pourriez-vous ajouter un peu de texte pour expliquer votre réponse?
Kmeixner
2

Ceci est indiqué dans les commentaires ailleurs sur cette page, mais a jugé utile de le retirer dans une réponse:

Lors de l'utilisation d'un adaptateur, j'ai constaté que les spinnerObject.setSelection(INDEX_OF_CATEGORY2)besoins devaient se produire après l' setAdapterappel; sinon, le premier élément est toujours la sélection initiale.

// spinner setup...
spinnerObject.setAdapter(myAdapter);
spinnerObject.setSelection(INDEX_OF_CATEGORY2);

Ceci est confirmé en examinant le code AbsSpinner pour setAdapter.

Andy
la source
Bien sûr, vous ne pouvez sélectionner un élément qu'une fois l'adaptateur rempli.
CoolMind
2

Voici ce que j'utilise dans Kotlin:

spinner.setSelection(resources.getStringArray(R.array.choices).indexOf("Choice 1"))
Donny Rozendal
la source
s'il indexOfne peut pas faire de correspondance, il revient -1, ce qui semble entraîner la valeur par défaut sélectionnée par spinner.setSelection. Je suis d'accord avec ça.
lasec0203
0

Dans mon cas, ce code m'a sauvé la journée:

public static void selectSpinnerItemByValue(Spinner spnr, long value) {
    SpinnerAdapter adapter = spnr.getAdapter();
    for (int position = 0; position < adapter.getCount(); position++) {
        if(adapter.getItemId(position) == value) {
            spnr.setSelection(position);
            return;
        }
    }
}
Juan Pablo
la source
Vous n'avez pas besoin de faire ça. l'adaptateur a un appel getPosition (item) qui renvoie la position int.
tzg
0

La plupart du temps, spinner.setSelection(i); //i is 0 to (size-1) of adapter's size ça ne marche pas. Si vous appelezspinner.setSelection(i);

Cela dépend de votre logique.

Si la vue est entièrement chargée et que vous souhaitez l'appeler à partir de l'interface, je vous suggère d'appeler

spinner.setAdapter(spinner_no_of_hospitals.getAdapter());
spinner.setSelection(i); // i is 0 or within adapter size

Ou si vous souhaitez basculer entre le cycle de vie d'une activité ou d'un fragment, appelez comme ceci

spinner.post(new Runnable() {
  @Override public void run() {
    spinner.setSelection(i);
  }
});
Shan Xeeshi
la source
0

J'avais fait une fonction d'extension Spinnerpour le chargement des données et le suivi de la sélection des éléments.

Spinner.kt

fun <T> Spinner.load(context: Context, items: List<T>, item: T? = null) {
    adapter = ArrayAdapter(context, android.R.layout.simple_spinner_item, items).apply {
        setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
    }

    if (item != null && items.isNotEmpty()) setSelection(items.indexOf(item))
}

inline fun Spinner.onItemSelected(
    crossinline itemSelected: (
        parent: AdapterView<*>,
        view: View,
        position: Int,
        id: Long
    ) -> Unit
) {
    onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
        override fun onNothingSelected(parent: AdapterView<*>?) {
        }

        override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
            itemSelected.invoke(parent, view, position, id)
        }
    }
}

Exemple d'utilisation

val list = listOf("String 1", "String 2", "String 3")
val defaultData = "String 2"

// load data to spinner
your_spinner.load(context, list, defaultData)

// load data without default selection, it points to first item
your_spinner.load(context, list)

// for watching item selection
your_spinner.onItemSelected { parent, view, position, id -> 
    // do on item selection
}
Sagar Chapagain
la source
-1

Cela a fonctionné pour moi:

@Override
protected void onStart() {
    super.onStart();
    mySpinner.setSelection(position);
}

Elle est similaire à la solution de @ sberezin mais appelle setSelection () dans onStart ().

JosinMC
la source
-1

J'ai eu le même problème depuis hier.Malheureusement, le premier élément de la liste des tableaux est affiché par défaut dans le widget spinner.Un revirement serait de trouver l'élément sélectionné précédent avec chaque élément de la liste des tableaux et d'échanger sa position avec le premier élément. Voici le code.

OnResume()
{
int before_index = ShowLastSelectedElement();
if (isFound){
      Collections.swap(yourArrayList,before_index,0);
   }
adapter = new ArrayAdapter<String>(CurrentActivity.this,
                            android.R.layout.simple_spinner_item, yourArrayList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item;                    yourListView.setAdapter(adapter);
}
...
private int ShowLastSelectedElement() {
        String strName = "";
        int swap_index = 0;
        for (int i=0;i<societies.size();i++){
            strName = yourArrayList.get(i);
            if (strName.trim().toLowerCase().equals(lastselectedelement.trim().toLowerCase())){
                swap_index = i;
                isFound = true;
            }
        }
        return swap_index;
    }
Vikhyat Chandra
la source