AW: Listview mit Firemonkey
Wie wäre es, wenn du extra ein TImage/TPaintbox oberhalb der Liste hättest und nur dort das Vorschaubild des aktuell selektierten/fokussierten Items anzeigst?
|
AW: Listview mit Firemonkey
Zitat:
Ein Grid/Liste mit Filterfunktion wäre da fast schon angebracht. |
AW: Listview mit Firemonkey
Zitat:
|
AW: Listview mit Firemonkey
Grundsätzlich stellt das kein Problem dar wenn man sich so bekannte Shopping-Apps von amazon oder ebay anschaut. Bislang habe ich dort keine Probleme gehabt auch mit riesigen Trefferlisten.
(Nein, gerade eine Trefferliste mit 1250 Einträge angeschaut - kein Problem und langsam ist es auch nicht) (Und noch eine mit >13000 Einträgen machte auch keine Probleme) |
AW: Listview mit Firemonkey
Zitat:
Die Frage war ja nicht, ob es sinnvoll ist 2500 zu verwenden, sondern eine andere. Wir kennen den Kontext nicht. Und ja, manchmal ist es einfacher in einer großen Liste mit scrollen etwas zu suchen, als vorher einen Filter einzugeben. |
AW: Listview mit Firemonkey
Da will ich auch mal...
Ich finde auch, dass ein Control/Framework generell performant mit großen Listen klar kommen muss. Ob man dann (zusätzlich) Filterung, Gruppierung und Umsortierung anbietet steht auf einem anderen Blatt. WENN man (z.B. auch nur in einem Wartungsbereich) eine reale komplette Liste einsehen will, sollte das auf jeden Fall schnell und problemlos möglich sein. |
AW: Listview mit Firemonkey
Liste der Anhänge anzeigen (Anzahl: 1)
Oh sinnvoll ist sowas schon. Bei meiner Sat>IP Anwendung habe ich im ungünstigsten Fall 3000 Einträge wenn ich Astra 19.2, 23. 28 und Hotbird 13 berücksichtige. Das wäre schon nett, wenn das performant gelistet werden könnte, zumal die Dekodierung von Mpeg2 und H264 mitunter arg an Leistung benötigt. Da ist das schon ein bisschen peinlich, wenn da die simple Liste mehr Leistung verbrät als die Videodarstellung :?
|
AW: Listview mit Firemonkey
Ich habe gestern vergessen zu erwähnen, dass du bei der Treeview-Komponente von Kernowsoftware auf Mobilen Geräten im OnScrollviewChange Ereignis ClearCache(TksClearCacheType.ksClearCacheNonVisibl e); aufrufen solltest.
Ansonsten cached er dir (in der aktuellen Version zumindest) jeden Eintrag und eh du dich versiehst ist der Speicher deines Telefons bzw. Tablets voll. Die Geschwindigkeit ist jetzt auch nicht das Nonplusultra, aber es ist erträglich. Eine reine virtuelle Treeview-Komponente wäre sicherlich besser. Mal gucken ob ich damit mal beginne :) |
AW: Listview mit Firemonkey
Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe meine beiden weiter oben gemachten Vorschläge mal umgesetzt und hab somit Deinen Beispielcode etwas geändert und im Painting-Event Source eingefügt, der die Bitmaps quasi "on the fly" erzeugt.
Maximal leben immer nur 60 Bitmaps zur gleichen Zeit, abhängig von der Variable Range, die Du halt bei Bedarf ändern kannst. Der Speicher wird also kaum belastet. So wird die Liste quasi ohne Verzögerung erstellt und auch das Zeichnen erfolgt ohne Verzögerung (jedenfalls auf dem PC, wie es auf dem mobilen Teil ist, musst Du selber ausprobieren, hab hier gerade nichts im Zugriff zum Testen --> Hier wäre eine kurze Rückmeldung von Interesse).
Delphi-Quellcode:
Anliegend ein Screenshot und das Demo-Projekt (mit Delphi Seattle erstellt).
procedure TForm19.Button1Click(Sender: TObject);
var i: integer; item: TListViewItem; begin ListView1.BeginUpdate; for i := 0 to 4000 do begin item := ListView1.Items.Add; item.Text := format('channel %d', [i]); item.Detail := 'lorem ipsum' + sLineBreak + 'lorem ipsum'; // item.Bitmap.SetSize(128,128); // item.Bitmap.Clear (TAlphaColorRec.red); end; ListView1.EndUpdate; end; procedure TForm19.ListView1Painting(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); var lvi: TListViewItem; L, start, stop, range, TopItem: Integer; begin if Listview1.ItemCount = 0 then exit; range := 20; TopItem := Round (Listview1.ScrollViewPos / Listview1.ItemAppearance.ItemHeight); Start := TopItem; Stop := Start + range; for L := Start to Stop-1 do begin if L <= Listview1.ItemCount-1 then begin lvi := Listview1.Items[L]; if lvi.Bitmap.Width = 0 then begin lvi.Bitmap.SetSize(128,128); lvi.Bitmap.Clear (TAlphaColorRec.red); end; end; end; // Bei Bedarf if Start > 50 then begin for L := Start-20 downto 0 do begin lvi := Listview1.Items[L]; if lvi.Bitmap.Width <> 0 then begin lvi.Bitmap.SetSize(0,0); end; end; end; if Stop + 20 <= Listview1.ItemCount-1 then begin for L := Stop + 20 to Listview1.ItemCount-1 do begin lvi := Listview1.Items[L]; if lvi.Bitmap.Width <> 0 then begin lvi.Bitmap.SetSize(0,0); end; end; end; end; Edit: Habe doch noch ein mobiles Teil gefunden (Samsung GT-N5100) und schnell mal selbst geteset. Das funktioniert absolut flüssig, null Verzögerung, dabei ist das Gerät noch nicht mal das schnellste. Man sollte aber für Range mehr als 20 Zeilen wählen, da auf größeren Geräten diese Anzahl schnell erreicht ist. 40-60 wären da wohl besser. Edit2: Wenn ich es mir genau überlege, könnte man die benötigte Range (also Anzahl der ListItems, die in der ListView maximal zur gleichen Zeit sichtbar sind) auch anhand der Höhe der Listview berechnen. |
AW: Listview mit Firemonkey
Hey, ich hab ja ein echtes Projekt hier - da kann ich das ganze gleich mal mit dem ksTableView gegentesten. Ich poste dann mal die Performance.
Erstaunlicherweise ist das sogar ein bisschen schneller als die Variante mit ksTableView und es lädt nicht so viele Bilder im Hintergrund. Eventuell musst man noch testen ob TopItem < 0 ist bzw. Stop >= Items.Count. @Harry: Das ist eventuell etwas ab vom Thema, aber hast du ne Idee wie ich mit ListView einen Eintrag via Drag&Drop verschieben kann? Die Ereignisse haben ja kein Target-Objekt, sondern nur die Position. Christian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz