【问题标题】:TListView record loading on demandTListView 记录按需加载
【发布时间】:2014-11-01 02:34:10
【问题描述】:

我已经使用 TListView 制作了我的应用程序,以将主数据集显示为列表作为导航记录的方式。我已将 LiveBindings 与 Sync * 连接一起使用。

主要问题是它将整个表加载到内存中。大多数时候这很慢,现在把它带到 android 上更糟糕。

我还没有找到任何关于如何分页的示例。我没有使用 sql,我使用的是按需检索记录的自定义 DataSet (Aurelius)。

由于我没有找到任何文档,因此我没有可分享的起点或代码。

如何让TListView按需加载记录?

PS。有一个similar SO 问题,但可以通过 SQL 语句解决。我没有可用的 SQL,我想知道 FMX 的实际版本是否会是更好的方法。

【问题讨论】:

  • @LURD 谢谢,我已经在使用 LiveBindings,我已经编辑了我的问题以说明这一点,因为我假设 LiveBindings 将是 FMX 的默认标准。使用 TListView 的 Sync 属性确实有效,但它加载了整个 DataSet,我希望它加载需要显示的内容,或者至少加载少量(页面)
  • 致反对者:请证明您的反对票是合理的。你肯定知道我的问题的答案,因为你发现它错了。
  • 与其关注控制,不如关注实际问题。我将创建一个 GUI 类来保存数据的子集并按需加载数据。然后,您可以将任何 GUI 控件绑定到此类,如果您决定用不同的控件替换 Listview,这将使生活更轻松。如果需要,您还可以在桌面应用程序上重复使用此类。
  • @eelias 这里有一篇关于 MGM(Model Gui Mediator)模式的好文章:andypatterns.com/files/… 虽然使用这种方法将有效地替换实时绑定,但我发现实时绑定缓慢且混乱。我为我的应用程序使用对象持久性框架 (tiOPF),它为大多数常见的 GUI 控件提供了中介,并且编写新的控件非常简单。

标签: delphi cross-platform firemonkey delphi-xe6 livebindings


【解决方案1】:

¨您的问题不在列表视图中,而在您的数据集中。配置数据集属性:

  1. FetchOptions.AutoFetchAll=禁用
  2. FetchOptios.RecRowSet=20;//每页的行数
  3. FetchOptions.Fetchmode=fmManual

在按钮中,或在 ListViewl.PullRefresh 事件中*

begin
FDQuery.EmptyDataSet;
FDQuery.FetchNext;
end

  • Pullrefresh 事件意味着您在列表视图中下推以获取新记录,这在 Iphone/Android 应用程序中很常见。要求 PullToRefresh 属性检查为 True

【讨论】:

  • 我对您的回答投了反对票,因为您的陈述“¨您的问题不在列表视图中,而是在您的数据集中”是不真实的。在 FireDAC(您显然指的是)中,数据集很好地支持按需获取。问题在于 Listview 和 Delphi 中的 BindListLink 机制。控件和绑定之间没有反馈,滚动时需要更多项目。您的手动方法也不起作用,因为列表视图中没有像“需要更多数据”这样的事件来确定用户何时滚动到列表末尾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-08
  • 1970-01-01
  • 2021-03-15
相关资源
最近更新 更多