2

我正在尝试使用自定义 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);
  }
}

在我的相应活动中,我使用了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(否则一切正常)然后从显示过滤数据集的活动返回时,我都会收到类似“检测到未关闭光标”之类的警告,甚至会收到类似“完成中”之类的错误尚未停用或关闭的光标”。任何想法为什么会发生这种情况?

我知道我请求一个初始光标来显示未过滤的列表,并且从我的活动返回后应该关闭这个光标(这似乎有效)。我还知道,随着我的过滤请求,我创建了一个新游标——根据ANDROID 开发人员的参考——应该在从runQueryOnBackgroundThread返回后与旧游标交换,因此旧游标应该被关闭。由于某种原因,这似乎出错了!

4

0 回答 0