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.
Utilisez les éléments suivants: spinnerObject.setSelection(INDEX_OF_CATEGORY2)
.
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);
}
});
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);
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 )
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"));
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;
}
}
}
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);
}
}
}
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
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"));
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.
C'est un travail pour moi.
spinner.setSelection(spinner_adapter.getPosition(selected_value)+1);
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()));
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;
}
}
}
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()) );
for (int x = 0; x < spRaca.getAdapter().getCount(); x++) {
if (spRaca.getItemIdAtPosition(x) == reprodutor.getId()) {
spRaca.setSelection(x);
break;
}
}
Voici ce que j'utilise dans Kotlin:
spinner.setSelection(resources.getStringArray(R.array.choices).indexOf("Choice 1"))
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
}
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);
}
});
_ {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
.