我有一个Cursor,它返回我使用SimpleCursorAdapter的行来填充ListView。我想过滤一些行,这样它们就不会显示在我的ListView中。我使用Activity中其他行的数据,所以我不想更改我的SQL以使用WHERE子句过滤它们。
阻止一行显示在ListView中的最佳方法是什么?理想情况下,我会检查我的行中的列,然后只向ListView添加满足条件的行。
答案 0 :(得分:18)
创建CursorWrapper
并覆盖move...()
方法,以转换过滤后的集合中的位置(ListView
将看到的内容)和实际Cursor
中的位置。然后,使用CursorWrapper
中的SimpleCursorAdapter
。
答案 1 :(得分:15)
谢谢,这对我有很大的帮助!如果您需要,请使用它:
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;
}
}
答案 2 :(得分:2)
在Romans的解决方案中添加
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()时会遇到一些问题。