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

  • Excepción de la base de datos SQLite de Android - código 14 (no se puede abrir el archivo de base de datos)
  • Navegar por la base de datos SQLite desde Android Studio
  • Determinar el tipo de datos de una columna en SQLite
  • SQLite Context.MODE_PRIVATE
  • Ciclo de vida de la base de datos Sqlite? ¿Se elimina cuando se cierra la aplicación?
  • Uso de Rest para almacenar datos en Sqlite
  • Android ExpandableListActivity y SimpleCursorTreeAdapter?
  • ¿Necesito un proveedor de contenido con un cargador de cursor?
  • Obteniendo un valor único de SQLite en android
  • Cómo almacenar una imagen en la base de datos android
  • Cómo obtener el registro de llamadas desde fecha específica en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.