Фильтруйте строки из Курсора, чтобы они не отображались в ListView - PullRequest
11 голосов
/ 12 июня 2010

У меня есть курсор, который возвращает строки, которые я использую с SimpleCursorAdapter, чтобы заполнить ListView.Я хотел бы отфильтровать некоторые строки, чтобы они не отображались в моем ListView.Я использую данные из строк в другом месте в своей Activity, поэтому я не хочу менять свой SQL, чтобы фильтровать их с помощью предложения WHERE.

Каков наилучший способ предотвратить отображение строки в моем ListView?В идеале я бы проверял столбец в моей строке, а затем добавлял в ListView только те строки, которые удовлетворяют условию.

Ответы [ 3 ]

18 голосов
/ 12 июня 2010

Создайте CursorWrapper и переопределите методы move...() для преобразования позиций в отфильтрованном наборе (что и увидит ListView) и позиций в фактическом Cursor.Затем используйте CursorWrapper в SimpleCursorAdapter.

15 голосов
/ 17 апреля 2013

Спасибо, это мне очень помогает! Используйте его, если вам нужно:

private class FilterCursorWrapper extends CursorWrapper {     
    private String filter;
    private int column;
    private int[] index;
    private int count=0;
    private int pos=0;

    public FilterCursorWrapper(Cursor cursor,String filter,int column) {
        super(cursor);
        this.filter = filter.toLowerCase();
        this.column = column;
        if (this.filter != "") {
            this.count = super.getCount();
            this.index = new int[this.count];
            for (int i=0;i<this.count;i++) {
                super.moveToPosition(i);
                if (this.getString(this.column).toLowerCase().contains(this.filter))
                    this.index[this.pos++] = i;
            }
            this.count = this.pos;
            this.pos = 0;
            super.moveToFirst();
        } else {
            this.count = super.getCount();
            this.index = new int[this.count];
            for (int i=0;i<this.count;i++) {
                this.index[i] = i;
            }
        }
    }

    @Override
    public boolean move(int offset) {
        return this.moveToPosition(this.pos+offset);
    }

    @Override
    public boolean moveToNext() {
        return this.moveToPosition(this.pos+1);
    }

    @Override
    public boolean moveToPrevious() {
        return this.moveToPosition(this.pos-1);
    }

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

    @Override
    public boolean moveToLast() {
        return this.moveToPosition(this.count-1);
    }

    @Override
    public boolean moveToPosition(int position) {
        if (position >= this.count || position < 0)
            return false;
        this.pos = position;
        return super.moveToPosition(this.index[position]);
    }

    @Override
    public int getCount() {
        return this.count;
    }

    @Override
    public int getPosition() {
        return this.pos;
    }

}

https://gist.github.com/ramzes642/5400792

2 голосов
/ 21 октября 2015

В решении римлян добавьте

this.pos = position;

в методе

@Override
public boolean moveToPosition(int position) {
    if (position >= this.count || position < 0)
        return false;
    return super.moveToPosition(this.index[position]);
}

В противном случае вы получите некоторые проблемы при использовании .moveToNext () и .moveToPrevious ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...