首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CursorAdapter中的setFilterQueryProvider()和runQueryOnBackgroundThread()有什么区别?

CursorAdapter中的setFilterQueryProvider()和runQueryOnBackgroundThread()有什么区别?
EN

Stack Overflow用户
提问于 2013-06-13 23:23:27
回答 2查看 3.8K关注 0票数 3

我不太明白,提供商的意思是ContentProvider吗?或者我认为他们是一样的。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-14 00:08:04

这些方法的文档非常清楚:

使用指定的约束运行查询。此查询由附加到此适配器的筛选器请求。查询由FilterQueryProvider提供。如果未指定提供程序,则不筛选并返回当前游标。此方法返回后,结果游标被传递给changeCursor(android.database.Cursor)并关闭前一个游标。此方法始终在后台线程上执行,而不是在应用程序的主线程(或UI线程)上执行。Contract:当constraint为null或empty时,必须在任何过滤之前返回原始结果。

在幕后,如果提供了FilterQueryProviderrunQuery()方法,runQueryOnbackgroundThread()方法只会运行该方法。当您需要过滤CursorAdapter而不创建子类时,您可以使用FilterQueryProvider,如果您扩展了CursorAdapter,您可以在仍然提供FilterQueryProvider或覆盖runQueryOnbackgroundThread()方法之间进行选择。

FilterQueryProviderContentProvider无关

CursorAdapter和CursorTreeAdapter的外部客户端可以使用此类来定义应该如何过滤适配器的内容。

票数 3
EN

Stack Overflow用户

发布于 2013-06-15 17:34:18

感谢@Luksprog给我的回复。另外,我还阅读了CursorAdapter、CursorFilter和Filter的源代码。事实证明,CursorFilter扩展了Filter,而CursorAdapter实现了Filterable和CursorFilter.CursorFilterClient。

因此,如果调用getFilter.filter(s),您将获得新的游标,并将CursorAdapter自动重置为新的游标。

但是如果你调用runQueryOnBackgroundThread(s),你只能得到一个新的游标。所以你不需要手动调用它。

此外,由于filter将调用runQueryOnBackgroundThread(s)runQueryOnBackgroundThread(s)将调用FilterQueryProvider.runQuery(s)。设置重新查询代码的最佳方法是调用

代码语言:javascript
运行
复制
CursorAdpapter adapter;
adapter.setFilterQueryProvider(new FilterQueryProvider() {
        @Override
        public Cursor runQuery(CharSequence constraint) {
            ...
            return db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
        }
    });

然后在需要重新查询时使用adapter.getFilter().filter(s);

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17090948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档