AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Android Listview mit Bitmap

Ein Thema von greenmile · begonnen am 15. Mär 2016 · letzter Beitrag vom 19. Mär 2016
Antwort Antwort
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#1

Android Listview mit Bitmap

  Alt 15. Mär 2016, 19:34
Hallo,

gibt es eigentlich in der FMX Android Listview eine einfache Möglichkeit, bei Bedarf statt ".Text" ein Bitmap anzuzeigen? Also mal so, mal so? Oder muss ich dafür einen Style anlegen und irgendwie importieren?
  Mit Zitat antworten Zitat
AndyDF

Registriert seit: 6. Sep 2006
Ort: Allgäu
99 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Android Listview mit Bitmap

  Alt 16. Mär 2016, 07:27
Hallo,

ich selbst verwende kaum noch die Properties von .Text / .Image von ItemObjects der ListView.

Ich konstruiere mir stattdessen das ListViewItem in ListView.OnUpdateObjects selbst:

Code:
procedure TFrmOverview.lvUpdateObjects(const Sender: TObject; const AItem: TListViewItem);
var
  TextLabel: TListItemText;
  Image: TListItemImage;
begin
  Image := AItem.View.FindDrawable(c_ItemDrawable_Image) as TListItemImage;
  if Image = nil then
  begin
    Image := TListItemImage.Create(AItem);
    Image.Name := c_ItemDrawable_Image;
    Image.Align := TListItemAlign.Leading;
    Image.VertAlign := TListItemAlign.Leading;
    Image.Height := c_EventImage_Heigth;
    Image.Width := c_EventImage_Width;
    Image.PlaceOffset.Y := 7;
    Image.PlaceOffset.X := 12;
    Image.ScalingMode := TImageScalingMode.Stretch;
  end;

  TextLabel := AItem.Objects.FindDrawable(c_ItemDrawable_TextHeader) as TListItemText;
  if TextLabel = nil then
  begin
    TextLabel:= TListItemText.Create(AItem);
    TextLabel.Name:= c_ItemDrawable_TextHeader;
    TextLabel.Align:= TListItemAlign.Leading;
    TextLabel.VertAlign:= TListItemAlign.Leading;
    TextLabel.TextAlign:= TTextAlign.Leading;
    TextLabel.PlaceOffset.X:= 120;
    TextLabel.PlaceOffset.Y:= 7;
    TextLabel.Font.Size:= 23;
    TextLabel.Font.Style := [TFontStyle.fsBold];
    TextLabel.Width:= 600;
    TextLabel.Height:= 30;
    TextLabel.WordWrap := false;
    TextLabel.Text:= '';
  end;
end;
Zugriff dann so:
Code:
var
  Drawable: TListItemDrawable;
begin
    Drawable := AListItem.Objects.FindDrawable(ADrawableName);

    if Assigned(Drawable) and (Drawable is TListItemText) then
      (Drawable as TListItemText).Text := AText;
end;
Vorteil, den ich da sehe: Man kann sehr flexibel sein ListViewItem aufbauen. Es ist auch möglich per .Visible einzelne Drawables auszublenden. Somit kannst du jede Zelle auch individuell gestalten.
Hoff das hilft dir.

Viele Grüße, Andy
Andreas Blenk
  Mit Zitat antworten Zitat
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Android Listview mit Bitmap

  Alt 16. Mär 2016, 20:03
Super, vielen Dank. Nur leider zeichnet er unter Windows das Image nicht links sondern addiert was dazu. Der ursprüngliche Test wird leider nicht entfernt (AItem.Text := ''). Und unter Android wird garnichts gezeichnet:

Code:
Function TfrmMain.GetBitmap(Name: String; var Target: TBitmap): Boolean;
  var
    Size: TSize;
    Item: TCustomBitmapItem;
begin
  If imgList.BitmapItemByName(Lowercase(Name), Item, Size) then begin
    Target.Assign(Item.Bitmap);
    Result := true;
  end else Result := false;
end;

...

var
   TextLabel: TListItemText;
   Image: TListItemImage;
   MyBitmap: TBitmap;
const
  c_ItemDrawable_Image = 'ItemImage';
  c_ItemDrawable_TextHeader = 'ItemText';
  c_EventImage_Heigth = 25;
  c_EventImage_Width = 100;
begin
  MyBitmap := TBitmap.Create;
  If GetBitmap(AItem.Text, MyBitmap) then begin
    Image := AItem.View.FindDrawable(c_ItemDrawable_Image) as TListItemImage;
    if (Image=nil)then begin
      Image          := TListItemImage.Create(AItem);
      Image.Name     := c_ItemDrawable_Image;
      Image.Align    := TListItemAlign.Leading;
      Image.VertAlign := TListItemAlign.Leading;
      Image.Height   := c_EventImage_Heigth;
      Image.Width    := MyBitmap.Width;
      Image.PlaceOffset.X := 30;
      Image.PlaceOffset.Y := 10;
      If not Assigned(Image.Bitmap) then Image.Bitmap := TBitmap.Create;
      Image.OwnsBitmap := false;
      Image.Bitmap.Assign(MyBitmap);
    end;
    AItem.Text := '';
    AItem.Invalidate;
    Exit;
  end;

  TextLabel := AItem.Objects.FindDrawable(c_ItemDrawable_TextHeader) as TListItemText;
  if TextLabel = nil then begin
    TextLabel:= TListItemText.Create(AItem);
    TextLabel.Name:= c_ItemDrawable_TextHeader;
    TextLabel.Align:= TListItemAlign.Leading;
    TextLabel.VertAlign:= TListItemAlign.Leading;
    TextLabel.TextAlign:= TTextAlign.Leading;
    TextLabel.PlaceOffset.X:= 40;
    TextLabel.PlaceOffset.Y:= 4;
    TextLabel.Font.Size:= 23;
    TextLabel.Font.Style := [TFontStyle.fsBold];
    TextLabel.Width:= 600;
    TextLabel.Height:= 30;
    TextLabel.WordWrap := false;
    TextLabel.Text:= AItem.Text;
    AItem.Text := '';
    AItem.Invalidate;
  end;

Geändert von greenmile (16. Mär 2016 um 20:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Android Listview mit Bitmap

  Alt 16. Mär 2016, 20:41
Euch ist schon bewusst dass ihr hier das Gleiche macht wie mit den Styles - nur wesentlich umständlicher

Warum nehmt ihr die Code-Tags und nicht die Delphi-Tags?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Android Listview mit Bitmap

  Alt 16. Mär 2016, 20:53
Naja umständlicher vielleicht, aber ich habe so meine Erfahrung mit den Styles. Gebranntes Kind scheut das Feuer und bis vor kurzem war diese ganze Style-Brühe mehr als Schrott. Vielleicht haben sie sich inzwischen gemausert, keine Ahnung, aber nachdem ich schon einige Male in der Vergangenheit Properties verloren habe, sie plötzlich beim Neu-Laden des Projektes anders aussahen oder einfach verloren gegangen sind, weil ich die Delphi Version aktualisiert habe ... Ne danke. Firemonkey ist eine Zicke. An sich ganz cool wenn man weiß, wie man mit ihr umgehen muss.

Anyway möchte ich nicht immer Bitmaps verwenden und so kann ich gezielt und einfach im Source ein Bitmap einblenden oder eben auch nicht.

BTW: In Android sind sie nicht sichtbar. Andy, hast Du da ev eine Idee?
  Mit Zitat antworten Zitat
AndyDF

Registriert seit: 6. Sep 2006
Ort: Allgäu
99 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Android Listview mit Bitmap

  Alt 17. Mär 2016, 14:11
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
Andreas Blenk
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz