2012-08-24 25 views
5

Tengo una ruleta que se llena con Category objetos que se recuperan de la base de datos. La tabla Categorías tiene columnas _id y category_name. Quiero mostrar el nombre de la categoría en la rueda giratoria, pero cuando el usuario selecciona un elemento, necesito que recupere la identificación del elemento seleccionado. He intentado lo siguiente: Variables¿Cómo recuperar una ID del elemento seleccionado en un Spinner dinámico?

declarando (en nivel de clase):

int currCategoryId; 

ArrayAdapter<String> adapter; 

NotesManager manager = new NotesManager(this); 
ArrayList<Category> arrListCategories; 
ArrayList<String> arrListCategoriesString = new ArrayList<String>(); 

Spinner spCategories; 

instanciarlos en onCreate método:

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 Traté:

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 obtengo un "

cadena no se puede convertir a la categoría" en esta línea: Category selectedCategory = (Category)spCategories.getItemAtPosition(pos);

También probé esto:

currCategoryId = view.getId(); 

Pero entonces, en lugar de 1 ó 2 (dependiendo de la categoría que he seleccionado , actualmente tengo 2 de ellos), obtengo un número muy largo ...

¿Cómo puedo solucionarlo? ¿Cómo puedo recuperar la identificación del objeto seleccionado?

+0

try parent.getAdapter.getItem(); y eche este artículo a su clase deseada, espero que esto funcione –

+0

@AdeelPervaiz No, no funcionó - no hay un método getAdapter ... – Igal

Respuesta

4

No puede usar el ArrayAdapter de todos modos porque es solo para cadenas (no para categorías). De ahí por qué estás obteniendo una excepción de casting. Puesto que usted tiene su Categoría ArrayList y su cadena ArrayList (que se utiliza para la ArrayAdapter) en el mismo orden, sólo tiene que utilizar

Category selectedCategory = arrListCategories.get(pos); 

en su método de onItemSelected()

+0

Sí, ¡funcionó! Intenté usar esta línea: 'Category selectedCategory = (Category) parent.getItemAtPosition (pos);', pero obviamente eso no funcionó. Veo mi error ahora. ¡Muchas gracias! – Igal

5

me gustaría utilizar un SimpleCursorAdapter, ya que almacena varias columnas , en lugar de ArrayAdapter que solo almacena uno.

Primera cambio NotesManager.getAllCategories() para devolver una Cursor que utiliza:

"SELECT _id, category_name FROM Table;" 

Usted puede ordenar alfabéticamente los resultados si se quiere:

"SELECT _id, category_name FROM Table ORDER BY category_name;" 

Siguiente se unen 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 en espera:

public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 
    // The parameter id already refers to your Category table's id column, 
} 

no extra get() llamadas o convertir cursores en las Listas necesarias!

Cuestiones relacionadas