valor validar texto studio recorrer posicion poner obtener eventos como codigo java android adapter spinner

java - validar - recorrer un spinner android



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

Aquí está cómo hacerlo si está utilizando 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 } }

(Quizás también necesite cerrar el cursor, dependiendo de si está utilizando un cargador).

También (un refinamiento de la respuesta de Akhil ) esta es la forma correspondiente de hacerlo si estás llenando tu Spinner desde 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 } };

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


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

public enum HTTPMethod {GET, HEAD}

utilizado en la siguiente clase

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

Código para configurar el spinner 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, y android.R.layout.simple_spinner_item se entrega por android-studio.


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

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

Recibirá una advertencia acerca de cómo la ArrayAdapter<String> a un ArrayAdapter<String> no está marcada ... realmente, podría usar un ArrayAdapter como lo hizo Merrill, pero eso solo intercambia una advertencia por otra.


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


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

Si establece los valores en el ArrayList usando String.format , DEBE obtener la posición del valor usando 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));

Debes obtener la posición de valor necesaria como esta:

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 te sea de utilidad.


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

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 <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 de conversión que se puede crear para todas las primitivas 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; }


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, tu fragmento de código será así:

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


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


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

  1. El siguiente código lee el valor del girador y establece la posición del girador 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 el código a continuación donde sepa que están presentes los últimos valores de giro, o en otro lugar según sea necesario. Este fragmento de código básicamente escribe el valor de giro 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();


Puedes usar esto también,

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


Si está usando 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 antiguo (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; }


Supongamos que su Spinner se llama 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 != null) { int spinnerPosition = adapter.getPosition(compareValue); mSpinner.setSelection(spinnerPosition); }


Tuve el mismo problema al intentar seleccionar el elemento correcto en un spinner que se rellena con un cursorLoader. Recuperé la identificación del elemento que quería seleccionar primero de la tabla 1 y luego usé un CursorLoader para rellenar el selector. En el onLoadFinished completé el cursor sobre el adaptador de la rueda giratoria hasta que encontré el elemento que coincidía con el id que ya tenía. Luego asignó el número de fila del cursor a la posición seleccionada de la ruleta. Sería bueno tener una función similar para pasar la identificación del valor que desea seleccionar en el control numérico cuando se rellenan los detalles en un formulario que contiene los resultados guardados.

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


Una forma sencilla de configurar un spinner basado en 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; }

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


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

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


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!


muy simple simplemente use getSelectedItem();

p.ej :

ArrayAdapter<CharSequence> 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, el 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 REPETIR [posición]. y funciona correctamente.


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