listview - 如何检测FMX ListView 何时滚动到底部?

标签 listview delphi scroll firemonkey

我正在开发 Firemonkey TListView 来显示搜索结果。此列表一次加载 25 个项目,但可能会显示数百个项目。

我需要检测用户何时向下滚动到底部,以便我可以获取接下来的 25 个项目以显示在列表中。但是,我找不到合适的属性来确定这一点。

OnPullRefresh 事件,但这适用于滚动到列表顶部并将其向下拉。我需要的是类似的,但是是列表的底部而不是顶部

有一个 OnScrollViewChange 事件,这似乎很合适。还有 ScrollViewPos 属性,它也很有用。但是,我无法弄清楚将该数字与什么进行比较 - 具体来说,是 ScrollViewPos 的最大可能值。我需要像 ScrollViewMax 这样的东西。

但我无法找到更多内容来准确检测用户已滚动到底部。

如何检测用户何时滚动到 Firemonkey TListView 底部,以便加载更多搜索结果?

编辑

如果由于某种原因无法做到这一点,还有另一种选择,可以使用“加载更多...”按钮将虚拟项目添加到列表末尾。但我宁愿它是自动化的。

编辑2

我忘了提及...我在此 ListView 中显示了搜索框,并且项目可以具有可变的高度。如果基于项目内容计算这是唯一的方法,那么这样的计算需要完美。我不想知道用户何时“接近”或“接近”底部,而是知道用户何时恰好到达列表的底部。

最佳答案

进一步调查我发现以下内容

function TListViewBase.GetItemRect(const AItemIndex: Integer): TRectF;

如果你更深入

function TListViewBase.GetItemRelRect(const Index: Integer; const LocRect: TRectF;
  const SideSpace: Integer = 0): TRectF;

然后你会发现最后一项的顶部是

listview1.GetItemRect(listview1.ItemCount-1).top+listview1.ScrollViewPos-listview1.SideSpace-listview1.LocalRect.top

无论您的元素可变高度是什么。这表示 FHeightSums[Index] 的值,它是一个列表,其中包含索引 Index

的项目的高度总和

现在解决问题: 您希望计算完美。你想要触地得分。

就是这样

procedure TForm5.ListView1ScrollViewChange(Sender: TObject);
var
Tmp_top : single;
begin
Tmp_top := listview1.GetItemRect(listview1.ItemCount-1).top+listview1.ScrollViewPos-listview1.SideSpace-listview1.LocalRect.top;

if Tmp_top+listview1.GetItemRect(listview1.ItemCount-1).height-listview1.Height=listview1.ScrollViewPos-2*listview1.SideSpace then
    showmessage('touch down');

end;

编辑:如果您进一步简化此公式,您将最终得到另一个答案,只需进行很少的升级

 procedure TForm5.ListView1ScrollViewChange(Sender: TObject);
begin

if listview1.GetItemRect(listview1.ItemCount-1).bottom=listview1.Height-listview1.SideSpace then
    showmessage('touch down');

end;

现在,这将涵盖填充、边距、侧边空间、搜索框可见性和搜索框大小更改的任何更改。

关于listview - 如何检测FMX ListView 何时滚动到底部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46305721/

相关文章:

windows - 如何显示格式化的月份名称?

delphi - 如何将Filter ComboBox(下拉框)变大?

javascript - 为什么 window.scroll() 和 window.width() 不能一起工作?

javascript - 在滚动上使用 javascript 动画图像序列

android - 像 youtube 应用程序一样突出显示 ListView 项目?

WPF : How to scroll a ListView control horizontal?

c# - 如何将填充设置为 ListView 项目?

delphi - 打开和关闭vcl窗体

jquery - animate.css 和基于 jQuery 的滚动动画

Android:如何允许在非触摸屏设备上的 ListView 中导航?