3

我不太明白,provider是指ContentProvider吗?或者我认为它们是相同的。

有任何想法吗?

4

2 回答 2

5

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

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

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

此外,由于 filter 将调用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);在需要重新查询时使用。

于 2013-06-15T09:34:18.487 回答
3

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

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

在引擎盖下,该runQueryOnbackgroundThread()方法只是运行if 提供的runQuery()方法。当您需要过滤而不创建子类时,FilterQueryProvider您将使用,如果您扩展您可以在仍然提供或覆盖该方法之间进行选择。FilterQueryProviderCursorAdapterCursorAdapterFilterQueryProviderrunQueryOnbackgroundThread()

FilterQueryProvider与 a 无关ContentProvider

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

于 2013-06-13T16:08:03.923 回答