我正在使用AutoCompleteTextView(稍后将其更改为editText,但一次只有一个问题)来过滤我实现textWatcher的listView的结果:
fqp = new FilterQueryProvider() {
@Override
public Cursor runQuery(CharSequence constraint) {
String itemName = constraint.toString();
return getSearch(itemName);
}
};
Cursor getSearch(String itemName) {
String searchSelect = "(" + MediaStore.Audio.Media.TITLE + " LIKE ? )";
String[] selectArgs = { "%" + itemName + "%"};
Cursor searchCursor = getContentResolver().query(
queryUri,
projection,
searchSelect,
selectArgs,
MediaStore.Audio.Media.TITLE + " ASC"
);
return searchCursor;
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
String empty = "";
if(s.toString() == empty){
adapter.changeCursor(getAll());
adapter.notifyDataSetChanged();
}else{
adapter.getFilter().filter(s.toString());
adapter.notifyDataSetChanged();
}
}
这个过滤器工作得很好,但是当我的autoCompleteTextView为空时,我需要想办法重置我的列表。当然有一种正确的方法可以做到这一点,除了测试它是否为空,但这是我试图无济于事的。我还应该创建两个游标:一个包含我的完整列表,另一个包含我的过滤列表,所以我不必重新查询内容提供商?
答案 0 :(得分:1)
问题似乎在于这一行
if(s.toString() == empty)
在Java中,您无法比较这样的字符串,您需要使用
if(s.toString().equals(empty))
还没有调用TextWatcher,因为侦听器未链接到您的AutoCompleteTextView。
我也应该创建两个游标:一个包含我的完整列表,另一个包含我的过滤列表,所以我不必重新查询内容提供者?
如果过滤后的列表每次都有相同的数据,那么最好保留对它的引用,而不是进行新的查询。
使用EditText的示例:
adapter.setFilterQueryProvider(fqp);
search.addTextChangedListener(watch);
fqp = new FilterQueryProvider() {
@Override
public Cursor runQuery(CharSequence constraint) {
String itemName = constraint.toString();
return getSearch(itemName);
}
};
Cursor cursor = getContentResolver().query(
queryUri,
projection,
null,
null,
MediaStore.Audio.Media.TITLE+" ASC"
);
Cursor getSearch(String itemName) {
String searchSelect = "(" + MediaStore.Audio.Media.TITLE + " LIKE ? )";
String[] selectArgs = { "%" + itemName + "%"};
Cursor searchCursor = getContentResolver().query(
queryUri,
projection,
searchSelect,
selectArgs,
MediaStore.Audio.Media.TITLE + " ASC"
);
return searchCursor;
}
TextWatcher watch = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
String empty = "";
if (s.toString().equals(empty)) {
adapter.changeCursor(cursor);
adapter.notifyDataSetChanged();
} else {
adapter.getFilter().filter(s.toString());
adapter.notifyDataSetChanged();
}
}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
};