¿Cómo recuperar un ID del elemento seleccionado en un Spinner dinámico?
Tengo un hilandero que se puebla con los objetos de la Category
que se recuperan de la db. La tabla Categorías tiene columnas _id
y category_name
. Quiero mostrar el nombre de la categoría en la ruleta, pero cuando el usuario selecciona un elemento, lo necesito para recuperar el ID del elemento seleccionado. He intentado lo siguiente:
Declaración de variables (en el nivel de clase):
- Alternativas de SQLite para Android
- Eliminar filas sqllite de android de más de x días
- Acceso a los datos principales de iOS desde Android
- Restaurar archivo DB de SQLite
- Android SQLite Eliminar problema de fila
int currCategoryId; ArrayAdapter<String> adapter; NotesManager manager = new NotesManager(this); ArrayList<Category> arrListCategories; ArrayList<String> arrListCategoriesString = new ArrayList<String>(); Spinner spCategories;
Instanciándolos en el método onCreate
:
manager.getAllCategories(); arrListCategories = manager.getAllCategories(); for (int i = 0; i < arrListCategories.size(); i++) { Category currCategory = arrListCategories.get(i); arrListCategoriesString.add(currCategory.getCategory_name().toString()); } adapter=new ArrayAdapter<String> (this, android.R.layout.simple_spinner_item, arrListCategoriesString); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spCategories.setAdapter(adapter); spCategories.setOnItemSelectedListener(spinnerListener);
Y este es el spinnerListener que intenté:
OnItemSelectedListener spinnerListener = new OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { // An item was selected. //currCategory = (String) parent.getItemAtPosition(pos).toString(); //selectedCategory = Category selectedCategory = (Category)spCategories.getItemAtPosition(pos); currCategoryId = selectedCategory.getId(); } public void onNothingSelected(AdapterView<?> arg0) { } };
Pero en este caso la aplicación se bloquea y estoy recibiendo un "
No se puede emitir cadena a Categoría "en esta línea:
Category selectedCategory = (Category)spCategories.getItemAtPosition(pos);
También he intentado esto:
currCategoryId = view.getId();
Pero entonces, en lugar de 1 o 2 (dependiendo de qué categoría he seleccionado, actualmente tengo 2 de ellos), estoy recibiendo un número muy largo …
¿Cómo puedo arreglarlo? ¿Cómo puedo recuperar el ID del objeto seleccionado?
- Limitar los registros obtenidos en Android (base de datos Sqlite)
- SQLite de Android Únete a la consulta
- Insertar datetime en la base de datos sqlite android
- Expandablelistview extiende simplecursoradapter para poblar desde sqlite
- Base de datos SQLite en tarjeta SD
- Cómo reducir la base de datos sqlite?
- Inserte un número de cadena que empiece por cero en la columna de cadena usando ContentValues, pero el cero inicial siempre se elimina
- Sqlite base de datos en el idioma persa
No puede utilizar el ArrayAdapter
todos modos porque es sólo para cadenas (no categorías). Por lo tanto, por qué está recibiendo una excepción de casting. Puesto que usted tiene su Category ArrayList
y su String ArrayList
(que se utiliza para el ArrayAdapter
) en el mismo orden, sólo use
Category selectedCategory = arrListCategories.get(pos);
En su método onItemSelected()
Utilizaría un SimpleCursorAdapter
porque almacena varias columnas, en vez de un ArrayAdapter
que almacena solamente uno.
Primero cambie NotesManager.getAllCategories()
para devolver un Cursor
que utilice:
"SELECT _id, category_name FROM Table;"
Puede ordenar los resultados en orden alfabético si lo desea:
"SELECT _id, category_name FROM Table ORDER BY category_name;"
Luego vincule este Cursor
directamente a su Spinner:
Cursor cursor = manager.getAllCategories(); SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, cursor, new String[] {"category_name"}, new int[] {android.R.id.text1}); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spCategories.setAdapter(adapter);
Finalmente en su OnItemSelectedListener
todo está listo y esperando:
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { // The parameter id already refers to your Category table's id column, }
No hay llamadas extra get()
o convertir los cursores en listas necesarias!
- Cómo borrar la selección en un EditText?
- Android: compilación de 9 archivos de parche para ser utilizado fuera de la carpeta de dibujo?