【问题标题】:Creating a Load More filter using a TListView Search - Firemonkey Mobile Application使用 TListView 搜索创建加载更多过滤器 - Firemonkey 移动应用程序
【发布时间】:2013-10-11 09:49:32
【问题描述】:

我设法通过一个 TEdit 创建了一个“搜索”栏,它可以搜索我从里面输入的任何内容 一个 ListView,它从数据库中获取其信息,并通过一个过滤器并在按下一个键后即时更新 ListView 的项目。

现在我正在尝试学习如何实现一种方法来暂时限制我在 ListView 中获得的结果,直到我按下“显示更多”按钮或类似的按钮以获得更多相关结果。

由于数据库可能会在我按下“A”时返回超过 500 个结果,这对手机的功能来说是苛刻的,所以我需要该功能来使我的搜索按钮更有效。

有人能给我一些关于我可以使用什么来制作这样的东西的指示吗?

编辑。

我用于在 ListView 中搜索的当前代码是这样的......

   procedure TContactsForm.Edit1ChangeTracking(Sender: TObject);
var
   Lower: string;
   i: integer;
begin
   Lower:= LowerCase(Edit1.Text.Trim);
   if Lower= '' then
   begin
     if Filtered then
       begin
       ListView1.Items.Filter := nil;
       ListView1.ItemIndex := BindSourceDB1.ComponentIndex;
       end;
     end
     else
     begin
       ListView1.ItemIndex := -1;
       ListView1.Items.Filter :=
       function(X: string): Boolean
       begin
         Result:= (Lower = EmptyStr) or LowerCase(X).Contains(Lower);
       end;
    end;
   end;

 function TContactsForm.Filtered: Boolean;
 begin
   Result := Assigned(ListView1.Items.Filter);
 end;

【问题讨论】:

  • 我的第一个建议是使用网格而不是列表视图。当您在用户键入时快速更新列表时,列表视图可能会大大落后,导致很多结果。
  • 谢谢,我会记住这一点,但我正在考虑 ListView 组件,因为我认为它的单元格从可以包含更多内容的方面来说更加灵活。
  • 考虑限制返回结果的数量。谷歌做到了 4。
  • 当 ListView 通过 BindSourceDB 从数据集中填充时,我可以这样做吗?

标签: delphi listview firemonkey searchbar


【解决方案1】:

最简单的方法是为您的 select 语句建模,使其仅返回有限的行数(您始终可以根据用户请求移除限制)。

对于 SQLite、MySQL 和 PostgreSQL,您可以使用 LIMIT 子句:

SELECT acolumn FROM atable WHERE afield LIKE :param LIMIT 4;  

在 SQL Server 中,您必须执行以下操作:

SELECT * FROM ( 
  SELECT column, ROW_NUMBER() OVER (ORDER BY name) as row FROM atable 
) a WHERE a.row <= 4

这具有额外的好处,即数据库生成和传输的数据更少。

在进行完整搜索时,您只需省略限制子句。

如果您想保留已有的结果并只是添加到额外的结果中,请使用
LIMIT 20 OFFSET 5 子句(如果没有 offset 关键字,操作数将反转 LIMIT 5,20)。
您总是想限制以使体验变得活泼。
每个新页面,您获取下 x 条记录。

您甚至可以在用户向下滚动列表时实时执行此操作。
当他接近列表底部时获取新记录。

【讨论】:

  • 非常感谢您,先生,我认为您的回答让我更清楚了。我将尝试使用 LIMIT 实现您的方式,因为这正是我想要的,但不知道 SQL 命令。我会通知你结果
  • 我正在使用 SQL Server 2005,我看到我必须使用类似于你给我的第二个代码块的东西,但是......我可以修改它以获得下一个 x 记录也像你告诉我 LIMIT,OFFSET sql 版本?为了做到这一点,因为我正在使用 SQL Server 2005 尝试在客户端数据集中创建一个具有范围和附加功能的过滤器,这样会更容易......处理它。
  • 好的,只需修改最后的where 以查找范围。
  • 我设法通过一个非常简单的 SQL 查询来实现它,并修改了每次按下按钮时客户端数据集将获取的行数。 SQL 代码需要更多的篡改,以减少我认为的服务器的疲劳。因为我还没有实现你告诉我的技术,但我现在有另一个问题。有没有办法让我检查客户端数据集是否有更多信息要获取,以便我可以停用“显示更多”按钮,以防它没有更多信息要获取或类似的东西?
  • 最好在一个新问题中提出这个问题。有几种选择。
猜你喜欢
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2016-02-23
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多