我不太明白,提供商是指ContentProvider吗?或者我认为它们是一样的。
有什么想法吗?
答案 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的外部客户端可以使用此类来定义应如何过滤适配器的内容。