カスタム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から戻った後、古いカーソルと交換する必要があります。これにより、古いカーソルを閉じる必要があります。どういうわけかこれはうまくいかないようです!