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

  • Android: onUpgrade no llama a la actualización de la base de datos
  • ¿Cómo obtener el recuento de filas de una consulta en Android usando SQLite?
  • Portable JDBC vs SQLite en Android
  • HTML5 SQLite vs Base de datos nativa en caso de PhoneGap
  • SQLiteException - sólo ocurre en algunos dispositivos
  • Almacenamiento y recuperación de datos no ingleses en la base de datos sqlite en android
  • SQLiteStatement ejecuta un SELECT / INSERT / DELETE / UPDATE
  • No es posible obtener datos de la base de datos Sqlite
  • Usando COLLATE en Android SQLite - Locales se ignora en la instrucción LIKE
  • Android Room: ¿Cómo modelar las relaciones?
  • Cómo limitar los datos añadidos por bucle en sqlite android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.