Establecer el elemento seleccionado de la ruleta mediante programación

384

Estoy trabajando en un proyecto de Android y estoy usando un spinner que usa un adaptador de matriz que se completa desde la base de datos.

No puedo averiguar cómo puedo configurar el elemento seleccionado mediante programación de la lista. Por ejemplo si, en la ruleta tengo los siguientes elementos:

  • Categoría 1
  • Categoría 2
  • Categoría 3

¿Cómo haría programáticamente la Categoría 2 como el elemento seleccionado cuando se crea la pantalla? Estaba pensando que podría ser similar a c # IE Spinner.SelectedText = "Categoría 2" pero no parece haber ningún método similar para Android.

Boardy
fuente
Siga este enlace: [Cómo configurar la selección en el elemento giratorio] [1] [1]: stackoverflow.com/questions/16358563/…
Maddy
1
Puedes pasar tu índice a spinner.setSelection(). Eso funcionaría bien. También puede crear un método que pueda ayudarlo a hacer coincidir sus índices con sus cadenas reales.
Taslim Oseni

Respuestas:

737

Usar el siguiente: spinnerObject.setSelection(INDEX_OF_CATEGORY2).

Arun George
fuente
287
Gracias, esto funcionó muy bien, mientras lo hacía, también encontré una forma de obtener el índice sin necesidad de recorrer el adaptador. mySpinner.setSelection(arrayAdapter.getPosition("Category 2"));
Usé lo
86
en caso de que no tenga el adaptador de referencia. mySpinner.setSelection (((ArrayAdapter) mySpinner.getAdapter ()). getPosition ("Value"));
Kalel Wade
3
sexSpinner.setSelection (adapter.getPosition (mUser.getGender ()) == -1? 0: adapter.getPosition (mUser.getGender ()));
Goofyahead
llamar a SetSelection () justo después de que setAdapter () parece mostrar siempre el primer elemento (Android 2.3), incluso el bueno se selecciona en dropView. agregando view.post () (@Marco Hernaiz Cao respuesta) arreglarlo por mí.
Cristo
3
Esto no funciona si el Spinner tiene un onItemSelectedListener (). El oyente no será llamado.
Don Larynx
80

Ninguna de estas respuestas me dio la solución, solo funcionó con esto:

mySpinner.post(new Runnable() {
    @Override
    public void run() {
        mySpinner.setSelection(position);
    }
});
Marco HC
fuente
3
Llamo a SetSelection () justo después de setAdapter (). Esto muestra el primer elemento siempre (Android 2.3), incluso el bueno se selecciona en dropView. Tu solución lo hizo por mí.
Cristo
2
Gracias, eso funcionó! BTW también funciona para ListView.post.run () performItemClick ()
Michael D.
¿Cómo puedo seleccionar el último en función del tamaño?
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;
        }
    }
}

Puede usar lo anterior como:

selectSpinnerItemByValue(spinnerObject, desiredValue);

y, por supuesto, también puede seleccionar por índice directamente como

spinnerObject.setSelection(index);
Yaqub Ahmad
fuente
Un error con este código es que @Boardy quiere la selección de la Category 2cual supongo que es una cadena (suponiendo que haya intentado usar Spinner.SelectedText = "Category 2"), pero el código anterior es para a long.
Arun George
Está poblando las categorías de la base de datos; debe haber una ID para cada categoría.
Yaqub Ahmad
1
¿Por qué asumir que es un CursorAdapter? SpinnerAdapter funciona igual de bien.
Greg Ennis
Creo que tiene un error aquí, debería serlo adapter.getItem(position), no adapter.getItemId(position).
Vadim Kotov
29

Alguna explicación (al menos para Fragmentos, nunca probé con Actividad pura). Espero que ayude a alguien a comprender mejor Android.

La respuesta más popular de Arun George es correcta, pero en algunos casos no funciona.
La respuesta de Marco HC utiliza Runnable, que es un último recurso debido a la carga adicional de la CPU.

La respuesta es: simplemente debe elegir el lugar correcto para llamar a setSelection () , por ejemplo, me funciona :

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

    yourSpinner.setSelection(pos);
 }

Pero no funcionará en onCreateView () . Sospecho que esa es la razón del interés en este tema.

El secreto es que con Android no puedes hacer lo que quieras con ningún método - oops :( - los componentes pueden no estar listos. Como otro ejemplo, no puedes desplazar ScrollView ni en onCreateView () ni en onResume () ( mira la respuesta aquí )

sberezin
fuente
Gracias. No sabía que Fragments tenía el método onResume.
ToolmakerSteve
Podría dar un +18 para que tu respuesta esté por encima de @Marco HC. Usted es el único que intenta hacer las cosas de la forma en que está destinado a ser hecho
Vedant
15

Para buscar un valor y seleccionarlo:

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
fuente
12

¿Por qué no usa sus valores de la base de datos y los almacena en una ArrayList y luego solo usa:

yourSpinner.setSelection(yourArrayList.indexOf("Category 1"));
RicardoSousaDev
fuente
1
Las diversas soluciones que usaron el DataAdapter no funcionaron para mí, pero usar la ArrayList a partir de la cual se construyeron los valores en este ejemplo hizo el truco.
ewall
8

La solución óptima es:

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

Para obtener la posición del elemento, agregue automáticamente la siguiente declaración

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

Puede hacer un método genérico para este tipo de trabajo como lo hago en mi UtilityClass que es

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
fuente
5

Puede configurarlo fácilmente de esta manera: en spinner.setSelection(1)lugar de 1, puede configurar cualquier posición de la lista que le gustaría mostrar.

Vadim Kotov
fuente
4

Tengo un SimpleCursorAdapter, así que tengo que duplicar los datos para usar el respose en esta publicación. Por lo tanto, te recomiendo que pruebes de esta manera:

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;
    }
}

Creo que es una forma real

pazfernando
fuente
1
sí, en el caso de SimpleCursorAdapter, spinnerRegion.getItemIdAtPosition (i) da un Cursor, que puede usarse para obtener las columnas.
lalitm
3

Esto es trabajo para mi.

 spinner.setSelection(spinner_adapter.getPosition(selected_value)+1);
Arpit Patel
fuente
¿Qué pasa con el +1?
SHADOW.NET
Debido a que comienza desde 0, entonces tenemos que agregar uno para obtener la respuesta correcta
Arpit Patel
2

Si tiene una lista de contactos, puede ir para esto:

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

Sé que ya está respondido, pero código simple para seleccionar un elemento, muy simple:

spGenre.setSelection( ( (ArrayAdapter) spGenre.getAdapter()).getPosition(client.getGenre()) );
Dante
fuente
2
  for (int x = 0; x < spRaca.getAdapter().getCount(); x++) {
            if (spRaca.getItemIdAtPosition(x) == reprodutor.getId()) {
                spRaca.setSelection(x);
                break;
            }
        }
Julio Cezar Riffel
fuente
44
¿Podría agregar un poco de texto para explicar su respuesta?
Kmeixner
2

Esto se afirma en los comentarios en otra parte de esta página, pero consideró útil obtener una respuesta:

Cuando uso un adaptador, descubrí que las spinnerObject.setSelection(INDEX_OF_CATEGORY2)necesidades deben ocurrir después de la setAdapterllamada; de lo contrario, el primer elemento siempre es la selección inicial.

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

Esto se confirma al revisar el código AbsSpinner para setAdapter.

Andy
fuente
Por supuesto, puede seleccionar un elemento solo después de que se haya llenado el adaptador.
CoolMind
2

Esto es lo que uso en Kotlin:

spinner.setSelection(resources.getStringArray(R.array.choices).indexOf("Choice 1"))
Donny Rozendal
fuente
si indexOfno puede hacer una coincidencia, entonces regresa -1, lo que parece dar como resultado que el valor predeterminado sea el seleccionado por spinner.setSelection. Estoy bien con eso.
lasec0203
0

En mi caso, este código me salvó el día:

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
fuente
No necesitas hacer esto. el adaptador tiene una llamada a getPosition (item) que devuelve int position.
tzg
0

La mayoría de las veces spinner.setSelection(i); //i is 0 to (size-1) of adapter's size no funciona. Si solo llamasspinner.setSelection(i);

Depende de tu lógica.

Si la vista está completamente cargada y desea llamarla desde la interfaz, le sugiero que llame

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

O si desea cambiar entre el ciclo de vida de la actividad / fragmento, llame así

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

Había hecho alguna función de extensión Spinnerpara cargar datos y rastrear la selección de elementos.

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)
        }
    }
}

Ejemplo de uso

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
fuente
-1

Esto funcionó para mí:

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

Es similar a la solución de @ sberezin pero llamando a setSelection () en onStart ().

JosinMC
fuente
-1

Tuve el mismo problema desde ayer. Desafortunadamente, el primer elemento de la lista de la matriz se muestra de forma predeterminada en el widget giratorio. Un cambio sería encontrar el elemento seleccionado anteriormente con cada elemento en la lista de la matriz e intercambiar su posición con el primer elemento. Aquí está el código.

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
fuente