2012-08-24 15 views
5

Ho uno spinner che è popolato con gli oggetti Category che vengono recuperati dal db. La tabella Categorie contiene le colonne _id e category_name. Voglio mostrare il nome della categoria nella casella di selezione, ma quando l'utente seleziona un elemento, ho bisogno che recuperi l'ID dell'articolo selezionato. Ho provato le seguenti: variabiliCome recuperare un ID dell'elemento selezionato in uno Spinner dinamico?

Dichiarazione (a livello di classe):

int currCategoryId; 

ArrayAdapter<String> adapter; 

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

Spinner spCategories; 

li Istanziare in onCreate metodo:

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); 

e questo è lo spinnerListener ho provato:

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) {  

     }     
    }; 

Ma in questo caso l'app si arresta in modo anomalo e viene visualizzato "

stringa non può essere lanciato alla Categoria" a questa linea: Category selectedCategory = (Category)spCategories.getItemAtPosition(pos);

Ho provato anche questo:

currCategoryId = view.getId(); 

Ma poi, invece di 1 o 2 (a seconda di quale categoria Ho selezionato , attualmente ne ho 2), sto ricevendo un numero molto lungo ...

Come posso risolvere il problema? Come posso recuperare l'ID dell'oggetto selezionato?

+0

try parent.getAdapter.getItem(); e lancia questo articolo nella classe desiderata, spero che funzionerà –

+0

@AdeelPervaiz No, non ha funzionato - non esiste il metodo getAdapter ... – Igal

risposta

4

Non è possibile utilizzare lo ArrayAdapter perché è solo per le stringhe (non per le categorie). Quindi perché stai ricevendo un'eccezione di casting. Dal momento che avete vostra categoria ArrayList e la vostra String ArrayList (che viene utilizzato per la ArrayAdapter) nello stesso ordine, basta usare

Category selectedCategory = arrListCategories.get(pos); 

nel metodo onItemSelected()

+0

Sì, ha funzionato! Ho provato ad usare questa linea: 'Category selectedCategory = (Category) parent.getItemAtPosition (pos);', ma ovviamente non ha funzionato. Vedo il mio errore ora. Grazie mille! – Igal

5

userei un SimpleCursorAdapter perché memorizza più colonne , invece di uno ArrayAdapter che ne memorizza solo uno.

Prima cambiamento NotesManager.getAllCategories() per restituire un Cursor che utilizza:

"SELECT _id, category_name FROM Table;" 

Potreste alfabetizzare i risultati se si desidera:

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

Successivo legano questo Cursor direttamente sul tuo 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); 

Infine nel vostro OnItemSelectedListener tutto è pronto e in attesa:

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

Nessun aggiuntivi get() chiamate o conversione cursori in elenchi necessari!

Problemi correlati