¿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):

 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?

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!

  • Devolver todas las columnas de una tabla SQLite en Android
  • RawQuery: enlace o índice de columna fuera de rango
  • SQLiteException: cerca de "": error de sintaxis (código 1) al compilar
  • ¿Hay alguna forma más rápida de iterar a través de las filas de la consulta Sqlite?
  • GreenDAO crea una propiedad de ID automática
  • Prácticas recomendadas para bases de datos de Android
  • Restablecer autoincremento en Android SQLite
  • Buscar en toda la base de datos SQLite utilizando FTS3 / FTS4?
  • Cómo mostrar todos los datos de la tabla de la base de datos en un TextView en android usando SQLite
  • El manejo de la base de datos dejó de funcionar en Android 2.2.1 (Desire HD 1.72.405.3)
  • ¿Cómo puedo mantener mi base de datos en una tarjeta SD y utilizar ORMLite?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.