如何检测FMX列表视图何时滚动到底部?

时间:2017-09-19 16:41:44

标签: listview delphi scroll firemonkey

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

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

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

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

但是我找不到更准确地检测用户已滚动到底部的任何内容。

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

修改

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

EDIT2

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

2 个答案:

答案 0 :(得分:2)

进一步调查我在

中找到了以下内容
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;

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

答案 1 :(得分:1)

试试这段代码。我认为不言自明......

procedure TForm1.ListView1ScrollViewChange(Sender: TObject);
var
  R: TRectF;
begin
  if TListView(Sender).ItemCount > 0 then // Just in case...
  begin
    // Get the last item's Rect
    R := TListView(Sender).GetItemRect(TListView(Sender).ItemCount - 1);
    // Bottom?
    if R.Bottom = TListView(Sender).Height then
      Caption := 'Reached bottom!'
    else
      Caption := 'Bottom not reached yet.';
  end;
end;