¿Cómo configurar el elemento seleccionado de Spinner por valor, no por posición?

Resuelto Pentium10 asked hace 54 años • 25 respuestas

Tengo una vista de actualización, donde necesito preseleccionar el valor almacenado en la base de datos para un Spinner.

Tenía en mente algo como esto, pero Adapterno tiene indexOfmétodo, así que estoy estancado.

void setSpinner(String value)
{
    int pos = getSpinnerField().getAdapter().indexOf(value);
    getSpinnerField().setSelection(pos);
}
Pentium10 avatar Jan 01 '70 08:01 Pentium10
Aceptado

Supongamos que su Spinnernombre es mSpinner, y contiene como una de sus opciones: "algún valor".

Para buscar y comparar la posición de "algún valor" en el Spinner use esto:

String compareValue = "some value";
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.select_state, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mSpinner.setAdapter(adapter);
if (compareValue != null) {
    int spinnerPosition = adapter.getPosition(compareValue);
    mSpinner.setSelection(spinnerPosition);
}
Merrill avatar Nov 19 '2010 18:11 Merrill

Una forma sencilla de configurar el control giratorio según el valor es

mySpinner.setSelection(getIndex(mySpinner, myValue));

 //private method of your class
 private int getIndex(Spinner spinner, String myString){
     for (int i=0;i<spinner.getCount();i++){
         if (spinner.getItemAtPosition(i).toString().equalsIgnoreCase(myString)){
             return i;
         }
     }

     return 0;
 } 

Ya existen formas de código complejo, esto es mucho más sencillo.

Akhil Jain avatar Feb 01 '2013 05:02 Akhil Jain

Basado en la respuesta de Merrill , se me ocurrió esta solución de una sola línea... no es muy bonita, pero puedes culpar a quien mantiene el código por Spinnerno incluir una función que haga esto para eso.

mySpinner.setSelection(((ArrayAdapter<String>)mySpinner.getAdapter()).getPosition(myString));

Recibirás una advertencia acerca de cómo la conversión a a ArrayAdapter<String>no está marcada... en realidad, podrías usar an ArrayAdaptercomo lo hizo Merrill, pero eso solo intercambia una advertencia por otra.

Si la advertencia causa un problema, simplemente agregue

@SuppressWarnings("unchecked")

a la firma del método o encima de la declaración.

ArtOfWarfare avatar Aug 22 '2012 20:08 ArtOfWarfare

Mantengo una ArrayList separada de todos los elementos en mis Spinners. De esta manera puedo hacer indexOf en ArrayList y luego usar ese valor para establecer la selección en el Spinner.

Mark B avatar Mar 05 '2010 21:03 Mark B