我正在尝试使用自定义CursorAdapter和ContentProvider为数据库条目列表实现过滤器函数。代码实际上按预期工作,但会导致警告,在某些情况下甚至会出错。在CursorAdapter中,我覆盖 runQueryOnBackgroundThread 执行过滤并返回游标:
@Override
public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
if (getFilterQueryProvider() != null) {
return getFilterQueryProvider().runQuery(constraint);
}
if (constraint == null || constraint.length() == 0) {
return context.getContentResolver().query(DBContentProvider.URI_LOGS, null,
LRMDatabase.LogTable.TYPE + " >= " + this.filterType, null, sqlOrder);
} else {
return context.getContentResolver().query(
DBContentProvider.URI_LOGS, null,
LRMDatabase.LogTable.TYPE + " >= " + this.filterType + " AND " +
LRMDatabase.LogTable.MSG + " LIKE '%" + constraint.toString() + "%'", null,
this.sqlOrder);
}
}
在我的相应活动中,我在oder中使用了 TextWatcher 来过滤数据集:
private TextWatcher filterTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s);
}
};
我现在的问题是,每当我之前调用 onTextChanged (否则一切正常)然后从我的活动返回时,我会显示过滤后的数据集,我会收到类似“< em>检测到未闭合光标“或甚至是”完成尚未停用或关闭的光标“之类的错误。任何想法为什么会这样?
我知道我请求一个初始游标来显示未过滤的列表,并且从我的活动返回后应该关闭这个游标(这似乎有效)。我也知道,除了我的过滤请求,我创建了一个新的游标 - 根据ANDROID developers reference - 应该在从 runQueryOnBackgroundThread 返回后使用旧游标进行交换,从而旧的游标应该是关闭。出于某种原因,这似乎出错了!