ListViewItem 的文本对齐方式

问题描述

在 Delphi 10.4 的 Firemonkey 中。我想构建一个列表视图,其中列表视图项文本根据列表项内容显示为左对齐或右对齐。

enter image description here

我这样做如下:

procedure TForm1.FormCreate(Sender: TObject);

  procedure AddItem(No: integer);
  var
    Item: TListViewItem;
  begin
    Item := ListView1.Items.AddItem(No);
    Item.Text := 'Text item No ' + No.ToString;
    Item.Tag := No;
    if No mod 2 = 0 then
      Item.Objects.TextObject.TextAlign := TTextAlign.Leading
    else
      Item.Objects.TextObject.TextAlign := TTextAlign.Trailing;
  end;

var
  c: integer;
begin
  for c := 0 to 9 do
    AddItem(c);
end;

然而,这并不适用于所有平台。但是,一旦 ListView 更改其大小,所有 ListItems 都会在左侧显示为齐平。有没有更好的方法来做到这一点?

作为一种解决方法,我做了以下工作:

procedure TForm1.ListView1Resized(Sender: TObject);
var
  c: integer;
begin
  for c := 0 to ListView1.ItemCount - 1  do
    if ListView1.Items[c].Tag mod 2 = 0 then
      ListView1.Items[c].Objects.TextObject.TextAlign := TTextAlign.Leading
    else
      ListView1.Items[c].Objects.TextObject.TextAlign := TTextAlign.Trailing;
end;

解决方法

使用 ItemAppearance=ListItem 无法解决此问题,因为在内部 ResetView 方法中,Item.Objects.TextObject 的所有属性都将写回 ItemAppearanceObjects.ItemObjects

因此,此应用程序的 ItemAppearance 必须设置为 DynamicAppearance。必须在 TextObjectAppearance 下的 Structure View 中手动创建两个 ListView.ItemAppearance.Item 对象,其中 Text1 必须设置为 TextAlign=Leading 和 {{1} } 到 Text2

enter image description here

之后,只有一个 Text Object 必须填充文本:

TextAlign=Trailing

这里是对应的 FMX 文件:

procedure TForm1.FormCreate(Sender: TObject);

  procedure AddItem(No: integer);
  var
    Item: TListViewItem;
  begin
    Item := ListView1.Items.AddItem(No);
    if No mod 2 = 0 then
      Item.Data['Text1'] := 'Text item No ' + No.ToString
    else
      Item.Data['Text2'] := 'Text item No ' + No.ToString
  end;

var
  c: integer;
begin
  for c := 0 to 9 do
    AddItem(c);
end;