[Delphi]FMXUI-ListView用法简介

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

[Delphi]FMXUI-ListView⽤法简介
在 FMXUI 中,有 TListExView 和 TListViewEx 两个ListView。

其中第⼀个是对Delphi原有TListView的功能扩展版,⽤法和原有的基本⼀样。

TListViewEx 则是 FMXUI 原创的⼀个 ListView ,今天我们要介绍的就是它了。

⼀、 IListAdapter 数据适配器
TListViewEx 的设计思想与Java原⽣安卓开发类似,使⽤了数据与显⽰分离的适配器模式。

组件本⾝不存放数据,只负责显⽰控制。

⽤户可以使⽤⾃带的⼏个简单的数据适配器或者实现IListAdapter接⼝,打造⾃⼰的数据适配器。

通过⾃带义数据适配器,我们可以实现任意样式的列表。

所以,这⾥的 IListAdapter 接⼝的重要性不⾔⽽预。

我们来看看 IListAdapter 的定义:
/// <summary>
/// 列表适配器接⼝
/// </summary>
IListAdapter = interface
['{5CC5F4AB-2D8C-4A84-98A7-51566E38EA47}']
function GetCount: Integer;
function GetItemID(const Index: Integer): Int64;
function GetItem(const Index: Integer): Pointer;
function IndexOf(const AItem: Pointer): Integer;
function GetView(const Index: Integer; ConvertView: TViewBase; Parent: TViewGroup): TViewBase;
function GetItemViewType(const Index: Integer): Integer;
function IsEmpty: Boolean;
function IsEnabled(const Index: Integer): Boolean;
function ItemDefaultHeight: Single;
procedure Clear;
procedure Repaint;
procedure NotifyDataChanged;
property Count: Integer read GetCount;
property Items[const Index: Integer]: Pointer read GetItem; default;
end;
GetCount: 返回数据的⼤⼩(总⾏数)
GetItemID: 指定索引项数据的ID(可以直接使⽤索引号)
GetItem:获取指定索引的数据
IndexOf: 查找数据,返回索引号
GetView:根据索引号,返回对应的可视对象(这个超级重要!!)
GetItemViewtype: 返回指定索引号的视图类型(这个也是重点)
IsEmpty: 判断列表是否为空(Count = 0)
IsEnabled: 判断某⾏数据是否有效
ItemDefaultHeight: 默认⾏⾼度(很重要,返回所有视图类型中的最⼤默认⾏⾼)
Clear: 清空数据
Repaint: 重绘
NotifyDataChanged: 通知列表框组件数据已经更新,需要重新绘制
Count: 数据的总数
在接⼝中,最常⽤的 GetView , GetItemViewType, ItemDefaultHeight , GetCount 这四个。

⼀般情况我们只需要继承 TListAdapterBase 或者TListAdapter ,然后重载这四个函数就可以了。

⼆、使⽤ ListView
我们实现如下效果。

第⼀步:创建⾃定义列表项视图。

添加⼀个Frame,命名为 CustomListView_ListItem 。

然后设计成这样:
第⼆步:创建数据适配器
type
TDataItem = record
Name: string;
Phone: string;
Color: TAlphaColor;
end;
TCustomListDataAdapter = class(TListAdapterBase)
private
[Weak] FList: TList<TDataItem>;
protected
function GetCount: Integer; override;
function ItemDefaultHeight: Single; override;
function GetItem(const Index: Integer): Pointer; override;
function IndexOf(const AItem: Pointer): Integer; override;
function GetView(const Index: Integer; ConvertView: TViewBase;
Parent: TViewGroup): TViewBase; override;
public
constructor Create(const AList: TList<TDataItem>);
end;
....
{ TCustomListDataAdapter }
constructor TCustomListDataAdapter.Create(const AList: TList<TDataItem>);
begin
FList := AList;
end;
function TCustomListDataAdapter.GetCount: Integer;
begin
if Assigned(FList) then
Result := FList.Count
else
Result := 0;
end;
function TCustomListDataAdapter.GetItem(const Index: Integer): Pointer;
begin
Result := nil;
end;
function TCustomListDataAdapter.GetView(const Index: Integer;
ConvertView: TViewBase; Parent: TViewGroup): TViewBase;
var
ViewItem: TCustomListView_ListItem;
Item: TDataItem;
begin
if (ConvertView = nil) or (not (ConvertView.ClassType = TCustomListView_ListItem)) then begin ViewItem := TCustomListView_ListItem.Create(Parent);
ViewItem.Parent := Parent;
ViewItem.Width := Parent.Width;
ViewItem.CanFocus := False;
end else
ViewItem := TObject(ConvertView) as TCustomListView_ListItem;
Item := FList.Items[Index];
ViewItem.BeginUpdate;
ViewItem.TextView1.Text := ;
ViewItem.TextView2.Text := Item.Phone;
ViewItem.View1.Background.ItemDefault.Color := Item.Color;
ViewItem.EndUpdate;
Result := TViewBase(ViewItem);
end;
function TCustomListDataAdapter.IndexOf(const AItem: Pointer): Integer;
begin
Result := -1;
end;
function TCustomListDataAdapter.ItemDefaultHeight: Single;
begin
Result := 72;
end;
第三步、应⽤数据适配器
在窗⼝上添加 TListViewEx,命名为 ListView。

在窗⼝初始化事件中,初始化数据适配器。

procedure TCustomListview.DoCreate;
begin
inherited;
FList := TList<TDataItem>.Create();
FAdapter := TCustomListDataAdapter.Create(FList);
end;
在窗⼝ Show 事件中,为 ListView 指定数据适配器。

procedure TCustomListview.DoShow;
begin
inherited;
ListView.Adapter := FAdapter;
AddItems(20); // 添加20⾏测试数据
end;
在窗⼝释放事件中,释放资源
procedure TCustomListview.DoFree;
begin
inherited;
ListView.Adapter := nil;
FAdapter := nil;
FreeAndNil(FList);
end;
添加测试数据的代码
procedure TCustomListview.AddItems(const Count: Integer);
var
I: Integer;
Item: TDataItem;
begin
for I := 0to Count - 1do begin
:= '⽤户名称' + IntToStr(I);
if I mod2 = 0then
Item.Color := TAlphaColorRec.Crimson
else
Item.Color := TAlphaColorRec.Yellow;
Item.Phone := '131 **** ****';
FList.Add(Item);
end;
FAdapter.NotifyDataChanged;
end;
注意:数据变更后,需要及时调⽤ NotifyDataChanged 来通知 ListView 更新显⽰。

三、下拉刷新和上拉加载更多
TListViewEx 也实现了下拉刷新和上拉加载更多的功能。

在属性⾯板中启⽤相应的选项即可。

EnablePullRefresh:是否启⽤下拉刷新
EnablePullLoad:是否启⽤上拉加载更多
OnInitFooter:加载⾃定义 Footer 事件, 如果不设置,将在需要时加载默认的 Footer
OnInitHeader:加载⾃定义 Header 事件, 如果不设置,将在需要时加载默认的 Header
OnPullRefresh:下拉刷新事件
OnPullLoad:上拉加载更多事件
TListViewEx 允许⾃定义 Footer 和 Header,只需要在上述相应的事件中,初始化为对应的视图就可以了。

⾃定义视图的实现⽅式也是新建⼀个 Frame 就可以了,参考 ListItem 和默认的实现。

不同的时需要实现 IListViewHeader 接⼝。

⽰例:
procedure TCustomListview.ListViewPullLoad(Sender: TObject);
begin
DelayExecute(1,
procedure (Sender: TObject)
begin
AddItems(20);
ListView.PullLoadComplete;
end
);
end;
procedure TCustomListview.ListViewPullRefresh(Sender: TObject); begin
Hint('正在加载数据');
DelayExecute(2,
procedure (Sender: TObject)
begin
FList.Clear;
AddItems(20);
ListView.PullRefreshComplete;
end
);
end;。

相关文档
最新文档