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.


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


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

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

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


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

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

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

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

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.


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


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

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

2

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

spGenre.setSelection( ( (ArrayAdapter) spGenre.getAdapter()).getPosition(client.getGenre()) );

2
  for (int x = 0; x < spRaca.getAdapter().getCount(); x++) {
            if (spRaca.getItemIdAtPosition(x) == reprodutor.getId()) {
                spRaca.setSelection(x);
                break;
            }
        }

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.


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

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

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

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
}

-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 ().


-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;
    }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.