Ich habe mir deinen Code nochmal angesehen. Also ich habe überhaupt keine Probleme mit iOS oder Android. Unter Windows schaut es manchmal nicht so aus wie ich es gerne hätte. Aber das ist in diesem Fall bei mir auch keine Zielplattform. iOS u. Android passt perfekt.
Zu Styles: Für meinen Fall muss ich ehrlich sagen, fahre ich auf diese Weise sehr gut. Da meine Oberfläche recht flexibel sein muss kann ich hier ganz gut reagieren.
Letztendlich mache ich nichts anderes als in "TFrmOverview.lvUpdateObjects" das Item zu "designen" und in einer eigenen Methode "DataToGui" das Item zu befüllen. Das funktioniert bei mir.
Ein paar Hinweise, die mir als Unterschiede auffallen:
- "TFrmOverview.lvUpdateObjects" mach immer das Selbe bei mir! Das Bitmap wird nicht in dieser Methode gesetzt. Wenn ich das Bild dann später nicht sehen will, setze ich .Visible auf false (in DataToGui). Bzw. ich weise gar kein TBitmap zu. Wenn das Objekt nil bleibt ist nichts zu sehen.
- Atem.Invalidate -> wofür?
- Die Reihenfolge in "TFrmOverview.lvUpdateObjects" ist entscheidend! In dieser Reihenfolge wird es übereinander gezeichnet.
- je nachdem woher du das Bild bekommst, musst du "OwnsBitmap" entsprechen setzen. Aber das machst du ja schon.
- ListView.ItemAppearance.ItemAppearance ist bei mir auf Custom. ItemHeight ist auch passend gesetzt.
- Ja das ist richtig, die standard Properties .Text / .Image werden immer noch angezeigt. Hierzu habe ich im Eigenschaftenexplorer alle auf Visible := false gesetzt! Die bleiben dann bei mir einfach unbeachtet, da ich das Item komplett selbst aufbaue.
- Für die Positionierung auch unbedingt ListView.ItemSpaces berücksichtigen! Meiner Erfahrung nach muss der Wert für Top und Bottom sogar in der ItemHeight mit einbezogen werden.
Hier noch meine Methode zum Setzen des Bitmaps (aus DataToGui() heraus):
Delphi-Quellcode:
class procedure TListViewHelper.SetListItemImage(const AListItem: TListViewItem; const ADrawableName: String; const ABitmap: TBitmap; const AOwnsBitmap: Boolean);
var
Drawable: TListItemDrawable;
begin
if Assigned(AListItem) then
begin
Drawable := AListItem.Objects.FindDrawable(ADrawableName);
if Assigned(Drawable) and (Drawable is TListItemImage) then
begin
(Drawable as TListItemImage).BeginUpdate;
try
(Drawable as TListItemImage).Bitmap := nil;
(Drawable as TListItemImage).OwnsBitmap := AOwnsBitmap;
(Drawable as TListItemImage).Bitmap := ABitmap;
finally
(Drawable as TListItemImage).EndUpdate;
end;
end;
end;
end;
Ab jetzt nehme ich die Delphi Tags