2010-08-16 16 views
9

Mam działanie, które rozszerza ListView. Wypełniam moją listę wynikami zapytania do bazy danych sqlite. Element listy składa się z czasu początkowego, końcowego, nazwy klienta i statusu. Są to 4 bity informacji, które muszę wyświetlić dla każdego elementu listy.przypisywanie ukrytych wartości do obiektu z listview

Moje pytanie brzmi: Czy mogę przypisać ukryte elementy do tego elementu ListView?

Na przykład chcę zapisać pole _id wiersza bazy danych dla tego elementu ListView, tak aby po kliknięciu go można było rozpocząć nowe działanie na podstawie danych dla tego wiersza bazy danych.

EDIT

Kodeks używam wypełnić moją listę z mojego kursora:

String[] columns = new String[] {VisitsAdapter.KEY_CLIENT_FULL_NAME, VisitsAdapter.KEY_STATUS,VisitsAdapter.KEY_CLIENT_START_TIME, VisitsAdapter.KEY_CLIENT_END_TIME}; 

// the XML defined views which the data will be bound to 
int[] to = new int[] { R.id.name_entry,R.id.number_entry,R.id.start_time_display,R.id.end_time_display }; 

SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(HomeScreen.this, R.layout.list_element, cur, columns, to); 

Gdzie R.layout.list_item jest XML do mojej listy pozycji. Pochodzę z tła PHP/HTML, więc to, co zwykle robiłbym tutaj, ma ukryte pole do przechowywania mojej wartości _id, które mogłem uzyskać wtedy, gdy kliknięto element listy. czy mogę zrobić coś podobnego w systemie Android? Czy mogę umieścić ukryte pole _id w moim układzie xml?

Odpowiedz

19

Powinieneś spróbować trochę poluzować się od struktury tworzenia stron internetowych. Nie ma potrzeby przechowywania czegoś takiego jak identyfikator w ukrytym polu w twoim widoku. To by zmieszało twoje dane z twoim interfejsem użytkownika i stworzyło wiele pomieszanych i niepotrzebnych obiektów widoku.

Jeśli używasz bazy danych sqlite do przechowywania wartości, powinieneś użyć CursorAdapter do zarządzania elementami listy. CursorAdapter przechowuje wynik uzyskany z bazy danych i zarządza sposobem wyświetlania danych użytkownikowi. Jeśli następnie zarejestrujesz onItemClickListener na twoim ListView, odbiornik otrzyma adapter i położenie elementu danych, którego komórka została kliknięta w adapterze. Teraz możesz użyć getItem, aby pobrać kursor wskazujący na wynik bazy danych, który został użyty do utworzenia listy. Teraz możesz uzyskać identyfikator lub wszystkie inne wartości, które nie są pokazywane użytkownikowi z wyniku bazy danych i dołączyć go do zamiaru rozpoczęcia następnej czynności.

+0

Kiedy mówisz, że powinieneś używać CursorAdapter, masz na myśli przeciwieństwo SimpleCursorAdapter w moim przykładowym kodzie? –

+2

Dziękuję za odpowiedź. Po przeszukaniu dokumentów na detektorach pozycji listowych odkryłem, że onListItemClick automatycznie przekazuje identyfikator typu rowID wyniku kursora. (kolumna _id z bazy danych). Dowiedziałem się o tym wszystkim źle (jak zauważyłeś), zakładając, że będę musiał ręcznie dodać go do elementu listy, ale nie zdaję sobie sprawy, że android zajmuje się tym automatycznie. Dzięki, Odpowiedź zaakceptowana. –

+0

+1 za miłe wyjaśnienie ... Ale w przypadku SimpleAdapter, w jaki sposób mogę osiągnąć to samo? – hemu

1

Powinieneś rozważyć utworzenie obiektu java, który zgromadziłby wszystkie te informacje. Na przykład, można utworzyć klasę jak "ListItem" a każdy element będzie mieć 5 właściwości:
start_time
end_time
CLIENT_NAME
stan id (i więcej jeśli trzeba)

A potem cię mają 2 opcje, albo serializuje się obiekt, aby umieścić cały obiekt w bazie danych, albo zachowujesz strukturę, którą już masz (przypuszczam), a każdy wiersz bazy danych staje się obiektem ListItem. Następnie, po wysłaniu zapytania do bazy danych, umieszczasz je wszystkie w tablicy ArrayList i rozszerzasz ArrayAdapter, aby utworzyć własną kartę. Na koniec, w metodzie getView, wywołujesz myListItem.getEnd_Time i całą metodę potrzebną do wyświetlenia twoich danych i po prostu nie używasz getId, którą możesz bezpośrednio użyć z adaptera, kiedy potrzebujesz tego obiektu.

+0

Niestety sephy, Im całkiem nowy android i ja naprawdę nie śledzić odpowiedzi, Ive napisali odpowiedni kod, aby pokazać gdzie Im pochodzące z –

+0

W jaki sposób traktować odpowiedź, gdy ludzie poświęcają czas, aby wytłumaczyć ci wszystko, a ty po prostu je głosujesz. Nie mogę w to uwierzyć. – Sephy

+0

Cześć, Sephy, powinienem zaznaczyć, że to nie ja obniżyłem twoją odpowiedź. Doceniam twoją odpowiedź i czas, jaki podjąłeś, by spojrzeć na moje pytanie. Nie mogę powiedzieć, kto ją obniżył, ponieważ nie wiem. To samo dotyczy odpowiedzi Kuroutadori. –

0

Jeśli potrzebujesz zakaz wyświetlania db cols inne niż _id w Twojej ListView za onItemClick (...) po prostu zadzwonić:

mAdapter.getCursor(); 

Następnie można uzyskać wszelkie zakaz wyświetlania cols wybranej listy pozycja/wiersz.

Jak Janusz wspomniano, jeśli trzeba tylko _id, zadzwoń:

mAdapter.getItemId(); 
Powiązane problemy