Jer*_*dge 1 delphi listview scroll firemonkey
我正在开发 FiremonkeyTListView来显示搜索结果。此列表一次加载 25 个项目,但可能会显示数百个项目。
我需要检测用户何时向下滚动到底部,以便我可以获取接下来的 25 个项目以显示在列表中。但是,我找不到合适的属性来确定这一点。
有一个OnPullRefresh事件,但这适用于滚动到列表顶部并将其下拉。我需要的是类似的,但是是列表的底部而不是顶部。
有一个OnScrollViewChange事件,看起来很合适。还有ScrollViewPos属性,也很有用。但是,我无法弄清楚将该数字与什么进行比较 - 具体来说,是 的最大可能值ScrollViewPos。ScrollViewMax我需要类似的东西。
但我找不到更多的东西来准确检测用户已滚动到底部。
如何检测用户何时滚动到 Firemonkey 底部TListView以便加载更多搜索结果?
编辑
如果由于某种原因无法做到这一点,则可以使用“加载更多...”按钮将虚拟项目添加到列表末尾。但我宁愿它是自动化的。
编辑2
我忘了提及...我在此列表视图中显示了搜索框,并且项目可以具有可变的高度。如果按照物品内容来计算是唯一的方法,那么这样的计算就必须是完美的。我不想知道用户何时“接近”或“接近”底部,而是知道用户何时恰好到达列表的底部。
进一步调查我发现以下内容
function TListViewBase.GetItemRect(const AItemIndex: Integer): TRectF;
Run Code Online (Sandbox Code Playgroud)
如果你深入
function TListViewBase.GetItemRelRect(const Index: Integer; const LocRect: TRectF;
const SideSpace: Integer = 0): TRectF;
Run Code Online (Sandbox Code Playgroud)
然后你会发现最后一项的顶部是
listview1.GetItemRect(listview1.ItemCount-1).top+listview1.ScrollViewPos-listview1.SideSpace-listview1.LocalRect.top
Run Code Online (Sandbox Code Playgroud)
无论您的物品可变高度是什么。这表示其值FHeightSums[Index]是一个列表,其中包含直到具有 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;
Run Code Online (Sandbox Code Playgroud)
编辑:如果您进一步简化这个公式,您将最终得到另一个答案,只需进行很少的升级
procedure TForm5.ListView1ScrollViewChange(Sender: TObject);
begin
if listview1.GetItemRect(listview1.ItemCount-1).bottom=listview1.Height-listview1.SideSpace then
showmessage('touch down');
end;
Run Code Online (Sandbox Code Playgroud)
现在,这将涵盖填充、边距、侧边空间、搜索框可见性和搜索框大小更改的任何更改。
| 归档时间: |
|
| 查看次数: |
2629 次 |
| 最近记录: |