¿Cómo configurar el elemento seleccionado de Spinner por valor, no por posición?
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 Adapter
no tiene indexOf
método, así que estoy estancado.
void setSpinner(String value)
{
int pos = getSpinnerField().getAdapter().indexOf(value);
getSpinnerField().setSelection(pos);
}
Supongamos que su Spinner
nombre 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);
}
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.
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 Spinner
no 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 ArrayAdapter
como 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.
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.