Ответ 1
Создайте CursorWrapper
и переопределите методы move...()
, чтобы преобразовать позиции в отфильтрованном наборе (что будет видеть ListView
) и позиции в фактическом Cursor
. Затем используйте CursorWrapper
в SimpleCursorAdapter
.
У меня есть курсор, который возвращает строки, которые я использую с SimpleCursorAdapter для заполнения ListView. Я хотел бы отфильтровать некоторые из строк, чтобы они не отображались в моем ListView. Я использую данные из строк в других местах моей деятельности, поэтому я не хочу менять свой SQL для их фильтрации с предложением WHERE.
Каков наилучший способ сохранить строку в моем ListView? В идеале я бы проверял столбец в моей строке, а затем добавлял строки в ListView, которые удовлетворяли условию.
Создайте CursorWrapper
и переопределите методы move...()
, чтобы преобразовать позиции в отфильтрованном наборе (что будет видеть ListView
) и позиции в фактическом Cursor
. Затем используйте CursorWrapper
в SimpleCursorAdapter
.
Спасибо, мне это очень помогает! Используйте его, если вам нужно:
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;
}
}
В решении по-римски добавьте
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().