您可以同时享受两者的好处。设置Filter
但在runQuery()
您的 中FilterQueryProvider
,不要对数据库运行全新的查询。只需在原始光标周围使用包装器即可过滤掉不需要的内容。这个包装器创建起来相当简单,在 SO 上也提到过。
根据最近的经验:不要同时使用两者。Filterable
做自己的后台处理,所以如果你使用它,根本不需要任何CursorLoader
。实际上,同时使用两者并没有真正的危害,但会导致不必要的查询和性能下降。您的runQuery()
查询应该处理两种情况,未过滤(约束为空)和过滤(约束不为空),这意味着所有查询操作都通过过滤器并且仅通过过滤器运行。启动它所需要做的就是在适配器的构造函数中调用它:
setFilterQueryProvider(this);
getFilter().filter(null);
一个令人讨厌的惊喜让我有些头疼。CusorLoader
很好地管理光标,即使在严格模式下,也没有问题,但是使用Filterable
,情况不太完美。正常操作没有问题,它确实处理了旧的游标,但活动生命周期的变化可以抓住它。我找到的解决方案是扩展ListView/RecyclerView
与这些适配器一起使用的视图,并确保最终销毁光标:
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
((CursorAdapter) getAdapter()).changeCursor(null);
}
作为替代方案,如果您不想扩展,您可以从您的活动中onDestroy()
为每个适配器支持的视图调用相同的方法,但我更喜欢第一个提供的设置并忘记它的方法。