Intereting Posts

Фильтровать строки из курсора, чтобы они не отображались в ListView

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

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

Solutions Collecting From Web of "Фильтровать строки из курсора, чтобы они не отображались в 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; } } 

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

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

 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 ().