¿Cómo establecer el ítem seleccionado de Spinner por valor, no por posición?

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

Estaba pensando en algo como esto, pero el Adapter no indexOf 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 llama mSpinner y contiene una de sus opciones: “algún valor”.

Para buscar y comparar la posición de “algún valor” en el Spinner, usa esto:

 String compareValue = "some value"; ArrayAdapter 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 establecer spinner en función del valor es

 mySpinner.setSelection(getIndex(mySpinner, myValue)); //private method of your class private int getIndex(Spinner spinner, String myString){ for (int i=0;i 

La forma de código complejo ya está allí, esto es mucho más simple.

Guardo una ArrayList separada de todos los artículos en mis Spinners. De esta forma puedo hacer indexOf en ArrayList y luego usar ese valor para establecer la selección en el Spinner.

Basado en la respuesta de Merrill , se me ocurrió esta solución de línea única … no es muy bonita, pero se puede culpar a quien mantiene el código de Spinner por descuidar la inclusión de una función que hace esto por eso.

 mySpinner.setSelection(((ArrayAdapter)mySpinner.getAdapter()).getPosition(myString)); 

Recibirá una advertencia sobre cómo se desactiva el lanzamiento a un ArrayAdapter … realmente, podría usar un ArrayAdapter como lo hizo Merrill, pero eso solo cambia una advertencia por otra.

si está utilizando una matriz de cadenas, esta es la mejor manera:

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

Si necesita tener un método indexOf en cualquier Adaptador anterior (y no conoce la implementación subyacente), puede usar 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; } 

Según la respuesta de Merrill, aquí está 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; } } 

Puedes usar esto también,

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

Use la siguiente línea para seleccionar el uso de valor:

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

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

Estoy usando un adaptador personalizado, para eso este código es suficiente:

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

Entonces, su fragmento de código será así:

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

Aquí está cómo hacerlo si está usando un SimpleCursorAdapter (donde columnName es el nombre de la columna db que utilizó para llenar 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 deba 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 estás llenando tu 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 } }; 

aquí está mi solución

 List 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!

De hecho, hay una manera de obtener esto utilizando una búsqueda de índice en AdaptorArray y todo esto se puede hacer con reflexión. Incluso di un paso más ya que tenía 10 Spinners y quería establecerlos dinámicamente desde mi base de datos y la base de datos contiene el valor, no solo el texto, ya que el Spinner 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 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); } 

Aquí está la búsqueda indexada que puede usar en casi cualquier lista siempre que 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  int indexedExactSearch(List 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 de conversión que se puede crear para todas las primitivas aquí es uno para cadena 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; } 

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

  1. A continuación, el código lee el valor del rotor y establece la posición del rotor según corresponda.

     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 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 coloque debajo del código donde se encuentran los últimos valores de centrifugado presentes, o en otro lugar según sea necesario. Este fragmento de código básicamente escribe el valor del 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 tratar de seleccionar el elemento correcto en una ruleta llena con un cursorLoader. Recuperé la identificación del artículo que quería seleccionar primero de la tabla 1 y luego usé un CursorLoader para poblar la ruleta. En el inicio de carga en línea, pasé por el cursor y llené el adaptador de la rueda giratoria hasta que encontré el artículo que coincidía con la identificación que ya tenía. Luego asignó el número de fila del cursor a la posición seleccionada del girador. Sería bueno tener una función similar para pasar la identificación del valor que desea seleccionar en la ruleta al completar los detalles en un formulario que contiene los resultados de la ruleta guardada.

 @Override public void onLoadFinished(Loader 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 correctas, solo 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 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 esta manera:

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

De lo contrario, obtendrás el -1 , artículo no encontrado.

Utilicé Locale.getDefault() debido al idioma árabe .

Espero que sea útil para ti.

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

 public enum HTTPMethod {GET, HEAD} 

usado en la siguiente clase

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

Código para configurar spinner por HTTPMethod enum-member:

  Spinner mySpinner = (Spinner) findViewById(R.id.spinnerHttpmethod); ArrayAdapter adapter = new ArrayAdapter(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, y android.R.layout.simple_spinner_item es entregado por android-studio.

 YourAdapter yourAdapter = new YourAdapter (getActivity(), R.layout.list_view_item,arrData); yourAdapter .setDropDownViewResource(R.layout.list_view_item); mySpinner.setAdapter(yourAdapter ); String strCompare = "Indonesia"; for (int i = 0; i < arrData.length ; i++){ if(arrData[i].getCode().equalsIgnoreCase(strCompare)){ int spinnerPosition = yourAdapter.getPosition(arrData[i]); mySpinner.setSelection(spinnerPosition); } } 

muy simple solo use getSelectedItem();

p.ej :

 ArrayAdapter type=ArrayAdapter.createFromResource(this,R.array.admin_typee,android.R.layout.simple_spinner_dropdown_item); type.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mainType.setAdapter(type); String group=mainType.getSelectedItem().toString(); 

el método anterior devuelve un valor de cadena

en lo anterior, R.array.admin_type es un archivo de recursos de cadena en valores

solo crea un archivo .xml en valores >> cadenas

tienes que pasar tu adaptador personalizado con una posición como REPEAT [posición]. y funciona correctamente