2012-07-26 20 views
6

Chcę uzyskać bieżący zapis kursora, zamiast tylko identyfikatora, aby móc manipulować menu kontekstowym.Jak uzyskać dane z kursora do ContextMenu

Widziałem ten przykład here które opisują, w jaki sposób uzyskać identyfikator:

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

To jest wielki, ponieważ pozwala mi uzyskać odpowiedni identyfikator bazy danych SQLite z klikniętego menu kontekstowego, które pozwoli mi pisać funkcja do wyszukiwania. Ale na pewno mogę po prostu ponownie użyć obecnego kursora?

Próbowałem w ten sposób:

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

ale linia kursora wydaje się wrócić tylko schematu bazy danych zamiast zapisu jestem po.

Czy ktoś mógłby rzucić trochę światła.

EDYCJA: Dzięki @azgolfer znalazłem rozwiązanie. Używam metody fillData() do zapełnienia adaptera. Zwykle jest to zadeklarowane bez zmiennych. Musiałem przedefiniować tę metodę za pomocą zmiennej terenowej. Odpowiedni fragment kodu do uczynienia adapter curstor widoczny w onContextItemSelected jest tutaj:

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

Co masz na myśli ponownego użycia? Natomiast 'c.getInt (1)' pobiera wszystko, co jest indeksem 1 tego rzędu kursora. Po prostu pobierzmy rekordy z innych indeksów tego wiersza kursorów, np. 'C.getString (2)'. Chyba, że ​​próbujesz zrobić coś innego. – Andy

+0

Przepraszam Zgaduję, że ponowne wykorzystanie pracy powinno być "używać". Chodzi o to, że kursor nie zwraca danych, tylko schemat. –

+0

Czy możesz wydrukować zawartość "itemPriority"? – Andy

Odpowiedz

13

Używasz CursorAdapter aby wyświetlić swoje pozycje listy, prawda? Następnie masz już dostęp do kursora, wywołując funkcję getCursor() na samym CursorAdapter. Aby pobrać prawidłowy rekord z kursora, wystarczy uzyskać pozycję użytkownika, który został naciśnięty przez użytkownika, a następnie przesunąć kursor do tej pozycji i pobrać dane.

pierwsze, ustalić pozycję, co użytkownik wciśnięty:

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

następnie przesuń kursor na żądanej pozycji i odzyskać rekord:

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

Twoja odpowiedź pomogła mi znaleźć rozwiązanie. Problem polegał na tym, że nie wiedziałem, że możesz zadeklarować adapter jako zmienną polową. Zaktualizowałem moje oryginalne pytanie, aby uwzględnić miejsce, w którym definiuję adapter. –

+0

Bardzo pomocny azgolfer, dzięki za tonę! – Soham

Powiązane problemy