菜鸟教程小白 发表于 2022-12-12 19:12:17

android - 不使用实时绑定(bind)以编程方式构建 TListView


                                            <p><p>我有一个包含 TFDMemtable(FireDAC) 的跨平台应用程序。</p>

<p>我的问题是,如何从该表中的记录手动构建 TListView?</p>

<p>我的表格包含按字母顺序排列的男性名字列表。</p>

<p>例如Adam、Anthony、Alan、Brian、Bill、Bob、Ben、Charlie、Craig、Christopher、Colin 等。</p>

<p>我希望 ListView 包含名称分组,例如 A、B、C 等。</p>

<p>到目前为止,我有以下内容:</p>

<pre><code>procedure BuildNameList;
var Litem : TListViewItem;
c : Char;
begin
ListView1.BeginUpdate;
try
   ListView1.ClearItems;

for c := &#39;A&#39; to &#39;Z&#39; do
begin
    with ListView1.Items.Add do
    begin
      Text := char(c);
      Purpose := TListItemPurpose.Header;
    end;

with dmod.tableNames do
begin
    First;
   while not Eof do
    begin
      Litem := ListView1.Items.Add;         
      Litem.Text := dmod.tableNames.FieldByName(&#39;ForeName&#39;).AsString;
      Next;
    end;
end;
end;
finally
    ListView1.EndUpdate;
end;
</code></pre>

<p>上面的代码没有给出我想要的结果,发生的事情是我在每个字母组(A-Z)下重复了每个名字。</p>

<p>任何建议/帮助将不胜感激。
谢谢</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您需要稍微更改您的逻辑以首先添加标题,然后是该标题下的名称,然后是下一个标题和一组名称。这是一个演示的完整测试应用程序。您需要在表单上放置 FMX TListView 和 TClientDataSet 并连接 FormCreate 事件以查看它的工作原理。 (请注意,在 ClientDataSet 上需要索引以确保名称的顺序正确;如果它们没有按字母顺序排列,则代码将无法工作,因为它无法找到需要添加到部分。)</p>

<pre><code>unit Unit3;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ListView.Types, Data.DB,
Datasnap.DBClient, FMX.ListView;

type
TForm3 = class(TForm)
    ListView1: TListView;
    CDS: TClientDataSet;
    procedure FormCreate(Sender: TObject);
private
    { Private declarations }
    procedure BuildNameList;
public
    { Public declarations }
end;

var
Form3: TForm3;

implementation

{$R *.fmx}

procedure TForm3.BuildNameList;
var
Item: TListViewItem;
Ch: Char;
begin
ListView1.BeginUpdate;
CDS.First;
try
    ListView1.ClearItems;
    for Ch := &#39;A&#39; to &#39;Z&#39; do
    begin
      Item := ListView1.Items.Add;
      Item.Text := Ch;
      Item.Purpose := TListItemPurpose.Header;

      while (CDS.FieldByName(&#39;SurName&#39;).AsString = Ch) and (not CDS.Eof) do
      begin
      Item := ListView1.Items.Add;
      Item.Text := CDS.FieldByName(&#39;SurName&#39;).AsString + &#39;, &#39; +
                     CDS.FieldByName(&#39;ForeName&#39;).AsString;

      CDS.Next;
      end;
    end;
finally
    ListView1.EndUpdate;
end;
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
// Create some test data
CDS.FieldDefs.Add(&#39;ForeName&#39;, ftString, 20);
CDS.FieldDefs.Add(&#39;SurName&#39;, ftString, 30);
CDS.CreateDataSet;
CDS.Open;
CDS.AppendRecord([&#39;John&#39;, &#39;Smith&#39;]);
CDS.AppendRecord([&#39;Jane&#39;, &#39;Doe&#39;]);
CDS.AppendRecord([&#39;Ralph&#39;, &#39;Richards&#39;]);
CDS.AppendRecord([&#39;Fred&#39;, &#39;Fredericks&#39;]);
CDS.AppendRecord([&#39;Sam&#39;, &#39;Samuels&#39;]);
CDS.AppendRecord([&#39;Walter&#39;, &#39;Williams&#39;]);
CDS.AppendRecord([&#39;Ann&#39;, &#39;Anderson&#39;]);
CDS.AppendRecord([&#39;Bob&#39;, &#39;Barnes&#39;]);

// Index it to put it in alphabetical order
CDS.IndexDefs.Add(&#39;Names&#39;, &#39;SurName;ForeName&#39;, []);
CDS.IndexName := &#39;Names&#39;;
BuildNameList;
end;

end.
</code></pre>

<p>这是该示例应用的 ListView 中心部分的屏幕截图,您可以查看结果:</p>

<p> <a href="/image/8jcKi.png" rel="noreferrer noopener nofollow"><img src="/image/8jcKi.png" alt="ListView displaying alpha list with section headers"/></a> </p></p>
                                   
                                                <p style="font-size: 20px;">关于android - 不使用实时绑定(bind)以编程方式构建 TListView,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/36337997/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/36337997/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: android - 不使用实时绑定(bind)以编程方式构建 TListView