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

Estaba pensando en algo como esto, pero el Adapter no tiene un método indexOf , así que estoy atascado.

 void setSpinner(String value) { int pos = getSpinnerField().getAdapter().indexOf(value); getSpinnerField().setSelection(pos); } 

Supongamos que su Spinner se denomina mSpinner , y contiene como una de sus opciones: "algún valor".

Para encontrar 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.equals(null)) { int spinnerPosition = adapter.getPosition(compareValue); mSpinner.setSelection(spinnerPosition); } 

Una manera simple de establecer el spinner basado en el valor es

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

Camino a código complejo ya están allí, esto es mucho más simple.

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

Basándome en la respuesta de Merrill, creé esta solución de línea única … no es muy bonita, pero puedes culpar a quien mantiene el código de Spinner por no incluir una función que haga esto por eso.

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

Obtendrás una advertencia sobre cómo el cast a un ArrayAdapter<String> está desmarcado … realmente, solo puedes usar un ArrayAdapter como lo hizo Merrill, pero eso solo cambia una advertencia por otra.

Basado en la respuesta de Merrill aquí es cómo hacer con un CursorAdapter

 CursorAdapter myAdapter = (CursorAdapter) spinner_listino.getAdapter(); //cast for(int i = 0; i < myAdapter.getCount(); i++) { if (myAdapter.getItemId(i) == ordine.getListino() ) { this.spinner_listino.setSelection(i); break; } } 

Si necesita tener un método indexOf en cualquier adaptador antiguo (y no conoce la implementación subyacente), puede utilizar esto:

 private int indexOf(final Adapter adapter, Object value) { for (int index = 0, count = adapter.getCount(); index < count; ++index) { if (adapter.getItem(index).equals(value)) { return index; } } return -1; } 

Si está utilizando matriz de cadena es la mejor manera:

 int selectionPosition= adapter.getPosition("YOUR_VALUE"); spinner.setSelection(selectionPosition); 

Usted puede utilizar esto también,

 String[] baths = getResources().getStringArray(R.array.array_baths); mSpnBaths.setSelection(Arrays.asList(baths).indexOf(value_here)); 

Utilice la siguiente línea para seleccionar usando el valor:

 mSpinner.setSelection(yourList.indexOf("value")); 

Aquí es cómo hacerlo si está usando un SimpleCursorAdapter (donde columnName es el nombre de la columna db que usó para rellenar su spinner ):

 private int getIndex(Spinner spinner, String columnName, String searchString) { //Log.d(LOG_TAG, "getIndex(" + searchString + ")"); if (searchString == null || spinner.getCount() == 0) { return -1; // Not found } else { Cursor cursor = (Cursor)spinner.getItemAtPosition(0); for (int i = 0; i < spinner.getCount(); i++) { cursor.moveToPosition(i); String itemText = cursor.getString(cursor.getColumnIndex(columnName)); if (itemText.equals(searchString)) { return i; } } return -1; // Not found } } 

(Tal vez también necesite cerrar el cursor, dependiendo de si está usando un cargador.)

También (un refinamiento de la respuesta de Akhil ) esta es la forma correspondiente de hacerlo si usted está llenando su Spinner de una matriz:

 private int getIndex(Spinner spinner, String searchString) { if (searchString == null || spinner.getCount() == 0) { return -1; // Not found } else { for (int i = 0; i < spinner.getCount(); i++) { if (spinner.getItemAtPosition(i).toString().equals(searchString)) { return i; // Found! } } return -1; // Not found } }; 

Este es mi método simple para obtener el índice por cadena.

 private int getIndexByString(Spinner spinner, String string) { int index = 0; for (int i = 0; i < spinner.getCount(); i++) { if (spinner.getItemAtPosition(i).toString().equalsIgnoreCase(string)) { index = i; break; } } return index; } 

Hay realmente una manera de conseguir esto usando una búsqueda del índice en el AdapterArray y todo esto se puede hacer con la reflexión. Incluso fui un paso más allá, ya que tenía 10 Spinners y quería establecer dinámicamente de mi base de datos y la base de datos tiene el valor no sólo el texto como el Spinner realmente cambia semana a semana por lo que el valor es mi número de identificación de la base de datos.

  // Get the JSON object from db that was saved, 10 spinner values already selected by user JSONObject json = new JSONObject(string); JSONArray jsonArray = json.getJSONArray("answer"); // get the current class that Spinner is called in Class<? extends MyActivity> cls = this.getClass(); // loop through all 10 spinners and set the values with reflection for (int j=1; j< 11; j++) { JSONObject obj = jsonArray.getJSONObject(j-1); String movieid = obj.getString("id"); // spinners variable names are s1,s2,s3... Field field = cls.getDeclaredField("s"+ j); // find the actual position of value in the list int datapos = indexedExactSearch(Arrays.asList(Arrays.asList(this.data).toArray()), "value", movieid) ; // find the position in the array adapter int pos = this.adapter.getPosition(this.data[datapos]); // the position in the array adapter ((Spinner)field.get(this)).setSelection(pos); } 

Esta es la búsqueda indexada que puede utilizar en casi cualquier lista siempre y cuando los campos estén en el nivel superior del objeto.

  /** * Searches for exact match of the specified class field (key) value within the specified list. * This uses a sequential search through each object in the list until a match is found or end * of the list reached. It may be necessary to convert a list of specific objects into generics, * ie: LinkedList&ltDevice&gt needs to be passed as a List&ltObject&gt or Object[&nbsp] by using * Arrays.asList(device.toArray(&nbsp)). * * @param list - list of objects to search through * @param key - the class field containing the value * @param value - the value to search for * @return index of the list object with an exact match (-1 if not found) */ public static <T> int indexedExactSearch(List<Object> list, String key, String value) { int low = 0; int high = list.size()-1; int index = low; String val = ""; while (index <= high) { try { //Field[] c = list.get(index).getClass().getDeclaredFields(); val = cast(list.get(index).getClass().getDeclaredField(key).get(list.get(index)) , "NONE"); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } if (val.equalsIgnoreCase(value)) return index; // key found index = index + 1; } return -(low + 1); // key not found return -1 } 

El método Cast que se puede crear para todos los primitivos aquí es uno para string e int.

  /** * Base String cast, return the value or default * @param object - generic Object * @param defaultValue - default value to give if Object is null * @return - returns type String */ public static String cast(Object object, String defaultValue) { return (object!=null) ? object.toString() : defaultValue; } /** * Base integer cast, return the value or default * @param object - generic Object * @param defaultValue - default value to give if Object is null * @return - returns type integer */ public static int cast(Object object, int defaultValue) { return castImpl(object, defaultValue).intValue(); } /** * Base cast, return either the value or the default * @param object - generic Object * @param defaultValue - default value to give if Object is null * @return - returns type Object */ public static Object castImpl(Object object, Object defaultValue) { return object!=null ? object : defaultValue; } 

Aquí está mi solución

 List<Country> list = CountryBO.GetCountries(0); CountriesAdapter dataAdapter = new CountriesAdapter(this,list); dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spnCountries.setAdapter(dataAdapter); spnCountries.setSelection(dataAdapter.getItemIndexById(userProfile.GetCountryId())); 

Y getItemIndexById a continuación

 public int getItemIndexById(String id) { for (Country item : this.items) { if(item.GetId().toString().equals(id.toString())){ return this.items.indexOf(item); } } return 0; } 

¡Espero que esto ayude!

Estoy utilizando un adaptador personalizado, para que este código es suficiente:

 yourSpinner.setSelection(arrayAdapter.getPosition("Your Desired Text")); 

Por lo tanto, su fragmento de código será así:

 void setSpinner(String value) { yourSpinner.setSelection(arrayAdapter.getPosition(value)); } 

Para hacer que la aplicación recuerde los últimos valores seleccionados del hilandero, puede usar el siguiente código:

  1. Debajo del código lee el valor de la hiladora y establece la posición del hilador en consecuencia.

     public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); int spinnerPosition; Spinner spinner1 = (Spinner) findViewById(R.id.spinner1); ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource( this, R.array.ccy_array, android.R.layout.simple_spinner_dropdown_item); adapter1.setDropDownViewResource(android.R.layout.simple_list_item_activated_1); // Apply the adapter to the spinner spinner1.setAdapter(adapter1); // changes to remember last spinner position spinnerPosition = 0; String strpos1 = prfs.getString("SPINNER1_VALUE", ""); if (strpos1 != null || !strpos1.equals(null) || !strpos1.equals("")) { strpos1 = prfs.getString("SPINNER1_VALUE", ""); spinnerPosition = adapter1.getPosition(strpos1); spinner1.setSelection(spinnerPosition); spinnerPosition = 0; } 
  2. Y ponga debajo del código donde usted sabe los valores más últimos del hilandero están presentes, o en alguna parte como requerido. Este pedazo de código básicamente escribe el valor de spinner en SharedPreferences.

      Spinner spinner1 = (Spinner) findViewById(R.id.spinner1); String spinlong1 = spinner1.getSelectedItem().toString(); SharedPreferences prfs = getSharedPreferences("WHATEVER", Context.MODE_PRIVATE); SharedPreferences.Editor editor = prfs.edit(); editor.putString("SPINNER1_VALUE", spinlong1); editor.commit(); 

Tuve el mismo problema al intentar seleccionar el artículo correcto en un hilandero poblado usando un cursorLoader. He recuperado el ID del elemento que quería seleccionar en primer lugar de la tabla 1 y luego utilizó un CursorLoader para llenar el hilandero. En el onLoadFinished, hice un ciclo a través del cursor que poblaba el adaptador del hilandero hasta que encontré el elemento que coincidía con el id que ya tenía. A continuación, asigna el número de fila del cursor a la posición seleccionada del girador. Sería agradable tener una función similar para pasar en la identificación del valor que usted desea seleccionar en el hilandero al poblar detalles en una forma que contiene resultados ahorrados del hilandero.

 @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { adapter.swapCursor(cursor); cursor.moveToFirst(); int row_count = 0; int spinner_row = 0; while (spinner_row < 0 || row_count < cursor.getCount()){ // loop until end of cursor or the // ID is found int cursorItemID = bCursor.getInt(cursor.getColumnIndexOrThrow(someTable.COLUMN_ID)); if (knownID==cursorItemID){ spinner_row = row_count; //set the spinner row value to the same value as the cursor row } cursor.moveToNext(); row_count++; } } spinner.setSelection(spinner_row ); //set the selected item in the spinner } 

Como algunas de las respuestas anteriores son muy correctas, sólo quiero asegurarme de que ninguno de ustedes caiga en este problema.

Si establece los valores en ArrayList utilizando String.format , DEBE obtener la posición del valor utilizando la misma estructura de cadena String.format .

Un ejemplo:

 ArrayList<String> myList = new ArrayList<>(); myList.add(String.format(Locale.getDefault() ,"%d", 30)); myList.add(String.format(Locale.getDefault(), "%d", 50)); myList.add(String.format(Locale.getDefault(), "%d", 70)); myList.add(String.format(Locale.getDefault(), "%d", 100)); 

Debe obtener la posición del valor necesario de la siguiente manera:

 myList.setSelection(myAdapter.getPosition(String.format(Locale.getDefault(), "%d", 70))); 

¡Si no, usted conseguirá el -1 , artículo no encontrado!

Utilicé Locale.getDefault() debido a la lengua árabe .

Espero que sea útil para usted.

Aquí está mi esperanzadamente solución completa. Tengo el siguiente enum:

 public enum HTTPMethod {GET, HEAD} 

Usado en la siguiente clase

 public class WebAddressRecord { ... public HTTPMethod AccessMethod = HTTPMethod.HEAD; ... 

Código para establecer la hiladora por HTTPMethod enum-member:

  Spinner mySpinner = (Spinner) findViewById(R.id.spinnerHttpmethod); ArrayAdapter<HTTPMethod> adapter = new ArrayAdapter<HTTPMethod>(this, android.R.layout.simple_spinner_item, HTTPMethod.values()); mySpinner.setAdapter(adapter); int selectionPosition= adapter.getPosition(webAddressRecord.AccessMethod); mySpinner.setSelection(selectionPosition); 

Donde R.id.spinnerHttpmethod se define en un archivo de diseño, android.R.layout.simple_spinner_item es entregado por android-studio.

Usted tiene que pasar su adaptador personalizado con la posición como REPEAT [posición]. Y funciona correctamente.

  • Actualizar los elementos de la ruleta en función del elemento seleccionado de otra ruleta
  • Spinner no envuelve texto - ¿esto es un error de Android?
  • Establecer clave y valor en el hilador
  • Desactivación de Spinner en android
  • Personalizar estilo spinner
  • Cómo configurar el color de texto de los elementos en Spinner Android
  • El indicador de Spinner no se muestra
  • Personalización de la fuente de spinner
  • Android: No se puede diseñar el divisor de hilado
  • Cómo cambiar el elemento de una ruleta en ActionBar mediante programación
  • Disposición de Android: Alinear un TextView y un Spinner
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.