2010-08-16 8 views
9

Ich habe eine Aktivität, die ListView erweitert. Ich befülle meine Liste mit den Ergebnissen einer Abfrage in der SQLite-Datenbank. Ein Listenelement besteht aus start_time, end_time, client_name und status. Dies sind die 4 Bits zu den Informationen, die ich für jedes Listenelement anzeigen muss.verdeckte Werte einem Listenansichtselement zuweisen

Meine Frage ist: Ist es mir möglich, diesem ListView Element versteckte Elemente zuzuordnen?

Zum Beispiel möchte ich das _id-Feld der Datenbankzeile für dieses ListView-Element speichern, so dass ich beim Klicken auf eine neue Aktivität basierend auf Daten für diese Datenbankzeile starten kann.

EDIT

Der Kodex ich meine Liste von meinem Cursor füllen:

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

Wo R.layout.list_item ist die XML für mein Listenelement. Ich komme aus einem PHP/HTML-Hintergrund, also würde ich hier normalerweise ein verstecktes Feld für meinen _id-Wert haben, auf das ich dann zugreifen könnte, sobald auf das Listenelement geklickt wurde. kann ich etwas ähnliches in android tun? kann ich ein verstecktes _id-Feld in mein XML-Layout einfügen?

Antwort

19

Sie sollten versuchen, sich ein wenig von der Entwicklung der Web-Entwicklung zu lösen. Es besteht keine Notwendigkeit, eine solche Sache wie die ID in einem versteckten Feld in Ihrer Ansicht zu speichern. Das würde Ihre Daten mit Ihrer Benutzeroberfläche mischen und viel Verwirrung und unnötige Ansichtsobjekte erzeugen.

Wenn Sie eine SQLite-Datenbank verwenden, um Ihre Werte zu speichern, sollten Sie eine CursorAdapter verwenden, um Ihre Listenelemente zu verwalten. Der CursorAdapter speichert das Ergebnis, das Sie aus der Datenbank erhalten haben, und verwaltet, wie die Daten dem Benutzer angezeigt werden. Wenn Sie dann einen onItemClickListener auf Ihrem ListView registrieren, erhält der Listener den Adapter und die Position des Datenelements, dessen Zelle im Adapter angeklickt wurde. Jetzt können Sie getItem verwenden, um einen Cursor abzurufen, der auf das Datenbankergebnis zeigt, das zum Erstellen des Listenelements verwendet wurde. Jetzt können Sie die ID oder alle anderen Werte, die dem Benutzer nicht angezeigt werden, aus dem Datenbankergebnis abrufen und anhängen, um die nächste Aktivität zu starten.

+0

Wenn du sagst, ich sollte einen CursorAdapter benutzen, meinst du, dass er dem SimpleCursorAdapter in meinem Beispielcode entgegengesetzt ist? –

+2

Danke für Ihre Antwort. Nach dem Durchsuchen der Dokumente auf Listenelement-Listener habe ich festgestellt, dass onListItemClick automatisch die Zeilen-ID des Cursor-Ergebnisses übergibt. (die Spalte _id aus der Datenbank). Ich ging das alles falsch (wie Sie darauf hinwiesen), da ich davon ausging, dass ich es manuell zum Listeneintrag hinzufügen müsste, ich würde nicht merken, dass Android das automatisch erledigt. Danke, Antwort angenommen. –

+0

+1 für nette Erklärung ... Aber im Falle von SimpleAdapter, wie kann ich das gleiche erreichen? – hemu

1

Sie sollten in Erwägung ziehen, ein Java-Objekt zu erstellen, das all diese Informationen sammelt. zum Beispiel, könnten Sie eine Klasse wie "ListItem" erstellen und jeder Punkt wird 5 Eigenschaften haben:
START_TIME
end_time
client_name
Status id (und mehr, wenn Sie benötigen)

Und Sie dann, haben Sie 2 Optionen, entweder Sie serialisieren Ihr Objekt, um das ganze Objekt in die Datenbank zu legen, oder Sie behalten die Struktur, die Sie bereits haben (ich nehme an), und jede Zeile Ihrer Datenbank wird ein ListItem Objekt. Wenn Sie dann Ihre Datenbank abfragen, legen Sie sie alle in eine ArrayList und erweitern ArrayAdapter, um Ihren eigenen Adapter zu erstellen. Schließlich rufen Sie in der getView-Methode myListItem.getEnd_Time und alle Methoden auf, die Sie zum Anzeigen Ihrer Daten benötigen, und verwenden Sie einfach nicht die getId, die Sie direkt aus dem Adapter verwenden können, wenn Sie das Objekt benötigen.

+0

Leider Sephy, Im ganz neu in Android und ich nicht wirklich die Antwort folgen, Ive einen entsprechenden Code geschrieben, wo Im von –

+0

kommen zu zeigen, Was ist das für eine Antwort, wenn sich die Leute die Zeit nehmen, dir etwas zu erklären, und du sie einfach abstimmst? Ich kann es nicht glauben. – Sephy

+0

Hallo Sephy, ich sollte darauf hinweisen, dass ich nicht deine Antwort herabgestuft habe. Ich schätze Ihre Antwort und die Zeit, die Sie sich genommen haben, um meine Frage zu sehen. Ich kann nicht sagen, wer es herabgestuft hat, wie ich es nicht weiß. Das gleiche gilt für Kuroutadori Antwort. –

0

Wenn Sie nicht-Anzeige db andere cols als _id, in der Listview ist onItemClick (...) Sie rufen:

mAdapter.getCursor(); 

Dann können Sie bekommen nicht-Anzeigen cols der ausgewählten Liste Artikel/Zeile.

Wie Janusz erwähnt, wenn Sie nur _id benötigen, rufen Sie einfach:

mAdapter.getItemId(); 
Verwandte Themen