2012-07-26 11 views
6

Desidero ottenere il record corrente di un cursore, anziché solo l'ID, in modo da poter manipolare un menu di scelta rapida.Come ottenere i dati dal cursore in ContextMenu

ho visto questo esempio here che mostra come ottenere l'ID:

@Override 
    public boolean onContextItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case DELETE_ID: 
     AdapterView.AdapterContextMenuInfo info= 
      (AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); 

     delete(info.id); 
     return(true); 
    } 

    return(super.onOptionsItemSelected(item)); 
    } 

Questo è grande, perché mi permette di ottenere l'ID del database SQLite appropriata del menu contestuale cliccato che mi permetterà di scrivere una funzione per fare una ricerca. Ma sicuramente posso solo riutilizzare il cursore corrente?

Ho provato a fare questo:

Cursor c = (Cursor) this.getListAdapter().getItem((int) info.id); 
String itemPriority = c.getInt(1); 
Log.v(TAG, "Current item:" + itemPriority); 

ma la linea del cursore sembra tornare solo lo schema del database invece del record che sto cercando.

Qualcuno potrebbe per favore versare un po 'di luce.

EDIT: Grazie a @azgolfer ho trovato la soluzione. Io uso un metodo fillData() per compilare l'adattatore. Normalmente questo è dichiarato senza variabili. Ho dovuto ridefinire questo metodo con una variabile di campo. La parte rilevante del codice per rendere l'adattatore curstor visibile in onContextItemSelected è qui:

private void fillData() { 
    Cursor itemsCursor = mDbHelper.fetchAllItemsFilter(mListId, mStatusFilter); 
    startManagingCursor(itemsCursor); 
    mItemAdaptor = new ItemAdapter(this, itemsCursor); 
    this.setListAdapter(mItemAdaptor);  
} 
+0

Che cosa si intende per il riutilizzo? E 'c.getInt (1)' sta ottenendo qualunque cosa sia l'indice 1 di quella riga del cursore. Quindi prendi i record dagli altri indici di quella riga dei cursori, come 'c.getString (2)'. A meno che non stiate provando a fare qualcos'altro. – Andy

+0

Scusa, suppongo che il riutilizzo del lavoro debba essere "uso". Il punto però è che il cursore non restituisce dati, solo lo schema. –

+0

Potresti per favore stampare ciò che è mostrato nell 'itemPriority'? – Andy

risposta

13

Si utilizza un CursorAdapter per visualizzare le vostre voci di elenco, giusto? Quindi hai già accesso al cursore chiamando getCursor() sul CursorAdapter stesso. Per recuperare il record corretto dal cursore, è sufficiente ottenere la posizione dell'oggetto che l'utente ha premuto, quindi spostare il cursore su quella posizione e recuperare i dati.

In primo luogo, determinare la posizione di ciò che l'utente ha premuto:

AdapterView.AdapterContextMenuInfo info= 
     (AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); 
int itemPosition = info.position; 

quindi spostare il cursore sulla posizione desiderata e recuperare il record:

Cursor cursor = (Your cursorAdapter).getCursor(); 
cursor.moveToPosition(itemPosition); 
String itemPriority = cursor.getInt(1); 
Log.v(TAG, "Current item:" + itemPriority); 
+0

La tua risposta mi ha aiutato a trovare la soluzione. Il problema era che non sapevo che si potesse dichiarare l'adattatore come variabile di campo. Ho aggiornato la mia domanda originale per includere dove definisco l'adattatore. –

+0

Azgolfer molto utile, grazie mille! – Soham