以正确的方式过滤光标?

and*_*dev 13 android

目前,我需要过滤Cursor/CursorAdapter,以仅显示与ListView中的特定条件匹配的行.我不想一直重新查询数据库.我只想过滤查询数据库时得到的光标.

我已经看到了这样一个问题:从Cursor中过滤行,这样它们就不会出现在ListView中

但我不明白如何通过覆盖我的CursorWrapper中的"移动"方法来进行过滤.一个例子很好.

非常感谢你.

sat*_*ine 19

更新:

我重写了源代码,我的雇主已将其作为开源软件提供:https://github.com/clover/android-filteredcursor

您不需要覆盖CursorWrapper中的所有移动方法,但由于Cursor接口的设计,您需要覆盖一堆.让我们假装您要过滤掉7行游标的第2行和第4行,创建一个扩展CursorWrapper的类并覆盖这些方法,如下所示:

private int[] filterMap = new int[] { 0, 1, 3, 5, 6 };
private int mPos = -1;

@Override
public int getCount() { return filterMap.length }

@Override
public boolean moveToPosition(int position) {
    // Make sure position isn't past the end of the cursor
    final int count = getCount();
    if (position >= count) {
        mPos = count;
        return false;
    }

    // Make sure position isn't before the beginning of the cursor
    if (position < 0) {
        mPos = -1;
        return false;
    }

    final int realPosition = filterMap[position];

    // When moving to an empty position, just pretend we did it
    boolean moved = realPosition == -1 ? true : super.moveToPosition(realPosition);
    if (moved) {
        mPos = position;
    } else {
        mPos = -1;
    }
    return moved;
}

@Override
public final boolean move(int offset) {
    return moveToPosition(mPos + offset);
}

@Override
public final boolean moveToFirst() {
    return moveToPosition(0);
}

@Override
public final boolean moveToLast() {
    return moveToPosition(getCount() - 1);
}

@Override
public final boolean moveToNext() {
    return moveToPosition(mPos + 1);
}

@Override
public final boolean moveToPrevious() {
    return moveToPosition(mPos - 1);
}

@Override
public final boolean isFirst() {
    return mPos == 0 && getCount() != 0;
}

@Override
public final boolean isLast() {
    int cnt = getCount();
    return mPos == (cnt - 1) && cnt != 0;
}

@Override
public final boolean isBeforeFirst() {
    if (getCount() == 0) {
        return true;
    }
    return mPos == -1;
}

@Override
public final boolean isAfterLast() {
    if (getCount() == 0) {
        return true;
    }
    return mPos == getCount();
}

@Override
public int getPosition() {
    return mPos;
}
Run Code Online (Sandbox Code Playgroud)

现在有趣的部分是创建filterMap,这取决于你.

  • 从你的答案中可以看出,创建filterMap似乎是一种自然的方法是将Cursor放入构造函数中,对每个条目使用过滤条件来确定是将该行添加到filterMap还是跳过它.现在您有一个Cursor,它只返回满足条件的条目. (3认同)