CursorAdapter中setFilterQueryProvider()和runQueryOnBackgroundThread()之间有什么区别?

时间:2013-06-13 15:23:27

标签: android android-cursoradapter

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

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

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

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

但是如果你打电话给runQueryOnBackgroundThread(s),你只会得到一个新光标。所以你不需要手动调用它。

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

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);

答案 1 :(得分:3)

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

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

如果提供了runQueryOnbackgroundThread()方法,runQuery()方法只会运行FilterQueryProvider的{​​{1}}方法。如果您需要在不创建子类的情况下过滤FilterQueryProvider,则可以使用CursorAdapter,如果您扩展CursorAdapter,则可以选择仍提供FilterQueryProvider或覆盖{{} 1}}方法。

runQueryOnbackgroundThread()FilterQueryProvider无关:

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