使用TListView搜索创建加载更多过滤器 - Firemonkey移动应用程序

时间:2013-10-11 09:49:33

标签: delphi listview firemonkey searchbar

我设法通过TEdit创建一个“搜索”栏,从内部搜索我输入的内容 一个ListView,它从DataBase获取其信息并通过一个过滤器,并在按下一个键后动态更新ListView的项目。

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

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

有人可以给我一些指示,说明我可以使用什么来制作类似的东西吗?

EDIT。

我用于在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;

1 个答案:

答案 0 :(得分:0)

最简单的方法是对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记录。

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