web-dev-qa-db-fra.com

Définir l'élément sélectionné de spinner par programmation

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

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

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

Comment pourrais-je définir par programme la catégorie 2 comme élément sélectionné lors de la création de l'écran? Je pensais que cela pourrait ressembler à c # I.E Spinner.SelectedText = "Catégorie 2" mais il ne semble pas exister de méthode similaire à celle-ci pour Android.

314
Boardy

Utilisez les éléments suivants: spinnerObject.setSelection(INDEX_OF_CATEGORY2).

644
Arun George

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

mySpinner.post(new Runnable() {
    @Override
    public void run() {
        mySpinner.setSelection(position);
    }
});
66
Marco HC
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 sur vous pouvez aussi sélectionner directement par index comme

spinnerObject.setSelection(index);
31
Yaqub Ahmad

Quelques explications (du moins pour Fragments - jamais essayé avec une activité pure). J'espère que ça aide quelqu'un à mieux comprendre Android.

La réponse la plus populaire de 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 devriez simplement choisir le bon endroit pour appeler setSelection (), par exemple il 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 porté à ce sujet. 

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

27
sberezin

Pourquoi n'utilisez-vous pas vos valeurs de la base de données et ne les stockez pas dans un ArrayList, puis utilisez simplement:

yourSpinner.setSelection(yourArrayList.indexOf("Category 1"));
11
RicardoSousaDev

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;
        }
    }
}
9
Ferran Maylinch

Vous pouvez créer une méthode générique pour ce type de travail, comme je le fais dans mon 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);
        }
    }
}
6
ZygoteInit

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

3
pazfernando

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 ajouter automatiquement la déclaration suivante 

itemsSpinner.setSelection(itemsSpinner.getPosition("item2"));
3
Naham Al-Zuhairi

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

2
user5495260

C'est un travail pour moi.

 spinner.setSelection(spinner_adapter.getPosition(selected_value)+1);
2
Arpit Patel

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()));
1
Maddy

Dans mon cas, ce code a sauvé ma 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;
        }
    }
}
1
Juan Pablo

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

spGenre.setSelection( ( (ArrayAdapter) spGenre.getAdapter()).getPosition(client.getGenre()) );
1
Dante
  for (int x = 0; x < spRaca.getAdapter().getCount(); x++) {
            if (spRaca.getItemIdAtPosition(x) == reprodutor.getId()) {
                spRaca.setSelection(x);
                break;
            }
        }
1
Julio Cezar Riffel

Voici ce que j'utilise dans Kotlin:

spinner.setSelection(resources.getStringArray(R.array.choices).indexOf("Choice 1"))
0
Donny Rozendal

J'avais créé une fonction d'extension de Spinner pour le chargement des données et le suivi de la sélection d'é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
}
0
Sagar Chapagain

La plupart du temps, spinner.setSelection(i); //i is 0 to (size-1) of adapter's size Ne fonctionne pas. Si vous appelez simplement spinner.setSelection(i);

Cela dépend de votre logique.

Si view est complètement chargé et que vous voulez l'appeler depuis 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 voulez changer de cycle de vie d'activité/de fragment, appelez comme ceci

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

_ {Ceci est indiqué dans les commentaires ailleurs sur cette page, mais a jugé utile de le tirer en réponse:} _

Lors de l'utilisation d'un adaptateur, j'ai constaté que spinnerObject.setSelection(INDEX_OF_CATEGORY2) devait se produire after l'appel setAdapter; 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 consultant le code AbsSpinner code pour setAdapter.

0
Andy