ListView mit jüngsten Item oben

  • Antworten:7
SebastianE
  • Forum-Beiträge: 37

27.07.2012, 00:57:39 via Website

Hallo,

in einem ListView trage ich Werte aus einer Arraylist ein. Die Werte werden ja automatisch so eingefügt das der jeweils nächste Wert immer unten an die angehangen wird. Das heißt, möchte man den letzten eingetragenen Wert sehen muß man die ListView unter Umständen weit nach unten scrollen.

Gibt es eine Möglichkeit das ganze umzudrehen? Also der neueste Wert soll oben in der ListView hinzugefügt werden und der älteste Wert soll ganz unten angezeigt werden? Man brächte dann nicht erst scrollen um den zuletzt eingetragenen Wert zu sehn.
Ich hab mir dazu überlegt das man die ArrayList ja rückwärts durchlaufen könnte wenn die Werte in die ListView eingetragen werden. Dann würde der jeweils nächste Wert ja immer oben in der ListView hinzugefügt. Dann müßte man aber bei jedem neuen Wert der in die ArrayList hinzugefügt wird und der im ListView angezeigt werden soll, die ganze ArrayList wieder durchlaufen und die Werte alle wieder neu in die ListView eintragen.

Gäbe es nicht eine andere Möglichkeit einen Wert der in die ArrayList hinzugefügt wird oben in der ListView anzuzeigen?

Viele Grüße,
SebastianE

Antworten
SebastianE
  • Forum-Beiträge: 37

27.07.2012, 08:25:22 via Website

Hallo Harald,

doch funktioniert. Danke für den Hinweis, da hab ich am vollkommen falschen Ende nach einer Lösung gesucht.

Wie funktioniert das ganze denn in der ArrayList wenn ich immer an Index 0 einen Wert hinzufüge? Werden bei jedem hinzufügen alle anderen Werte erstmal eins weiter verschoben/kopiert und dann der neue Wert bei Index 0 eingefügt? Angenommen die Arraylist enthält 300 Werte, ist das alles noch schnell genug?

Nochmals vielen Dank für Deinen Tip, hat mir schon sehr geholfen!

Viele Grüße,
SebastianE

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

27.07.2012, 08:50:11 via Website

SebastianE
Wie funktioniert das ganze denn in der ArrayList wenn ich immer an Index 0 einen Wert hinzufüge? Werden bei jedem hinzufügen alle anderen Werte erstmal eins weiter verschoben/kopiert und dann der neue Wert bei Index 0 eingefügt? Angenommen die Arraylist enthält 300 Werte, ist das alles noch schnell genug?
Doch genauso funktioniert das und ja diese Operation ist bei einer ArrayList recht ineffizient (Wobei 300 Werte da noch absolut unkritisch sind).
Es gibt aber andere List Implementierungen, die bei solchen Operationen besser performen sollten, wie z.B. eine LinkedList.

Schau einfach mal in die JavaDoc. Dort stehen bei allen möglichen List, Map, etc. Implementierungen in der Regel auch die Laufzeitengrenzen für die üblichen Operationen.

— geändert am 27.07.2012, 08:51:36

Antworten
SebastianE
  • Forum-Beiträge: 37

27.07.2012, 11:13:22 via Website

Hallo Rafael,
hab mir die JavaDocs zu Arraylist mal angesehn (http://docs.oracle.com/javase/6/docs/api/) aber nix weiter zu den Laufzeitengrenzen gefunden oder ich versteh den Hintergrund falsch. Trozdem Danke für den Hinweis auf die Doc's, da werd ich sicher noch das ein oder andere von benötigen.

@Harald:
"Referenzen auf die Werte" meinst Du damit Pointer? Dann müßte es ja eine Liste geben die diese Pointer verwaltet oder ehe ich auch das falsch? Scheint ja ein ziemlich aufwendiges und kompliziertes Konstrukt zu sein das Arraylist. Datenbanktabelle war mir der Overhead zu groß da lediglich ein Wert je Datensatz gespeichert würde. Es können durchaus auch mal 400 Werte sein aber ein Datensatz hat eben nur einen Wert in meinem Fall. Grundsätzlich möchte ich mich aber in naher Zukunft schon mit der Datenbank für Android auseinandersetzen da ich noch eine andere App im Kopf hab die ich gerne entwickeln möchte.
Datenbanken habe ich auch schon verwendet im Zusammenhang mit ADO und Delphi. Bin schon gespannt wie performant SQLite ist.

Viele Grüße,
SebastianE

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

27.07.2012, 11:18:15 via Website

@Harald:
Auch ein Pointer ist ein Wert im Array und davon müssen halt 300 verschoben werden.
Also wenn man die Formulierung nicht über Gebühr auf die Goldwaage legt, hat er schon Recht :)

@Sebastian:
OK die Laufzeitgrenzen stehen überwiegend bei den Map Klassen.
Also halt mal selbst kurz überlegen.
Bei einer LinkedList sind 2 Operationen nötig (Zeiger von Kopf auf neues Element und vom neuen Element auf ehem. erstes setzen),
um am Anfang was einzufügen -> kostante Laufzeit
Bei einer ArrayList sind <SIZE> + 1 Operationen nötig und wenn man Pech hat auch eine Vergrößerung des Arrays in der Arraylist, was richtig teuer ist.
-> lineare Laufzeit + X
Wenn du also auf die Laufzeit achten möchtest nimm eine LinkedList, aber wie gesagt ist das bei 300 Elementen noch völlig unkritisch.

— geändert am 27.07.2012, 11:21:00

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

27.07.2012, 11:31:14 via Website

Pointer wäre im Java-Sinne falsch - es trifft es aber in etwa ;-)

Kompliziert? Überhaupt nicht. Mach Dir darüber mal keinen Kopf. Vor über 30 Jahren war das kompliziert (in Assembler und ohne Prozessor OP-Codes die komplette Speicherbereiche oder komplette Registersätze in einem Rutsch rumschieben). Heute ist das Peanut. Hey, ein Cortex A8 macht 2.000.000.000 Instruktionen pro Sekunde (2.000 MIPS). 300 "Pointer"? Lachhaft - auf meinem alten Sinclair ZX80 war das eine Herausforderung (Artikel).

SQLite ist verdammt schnell und das bei einer sehr guten SQL Standard Unterstützung. Das was eine typische App braucht wird unterstützt.

— geändert am 27.07.2012, 11:51:23

Antworten