这是我的应用程序所做的,用户可以通过搜索框进行搜索。当他输入内容和匹配时,它会过滤gridview。但是当他试图删除时,没有记录显示。 在清空搜索框时,我一直在显示整个记录。
这是我尝试过的:
MainActivity.class:
etSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
adapter.getFilter().filter(cs.toString());
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void afterTextChanged(Editable cs) {
}
});
CustomAdapter.class:
@Override
public Filter getFilter() {
if (starsFilter == null)
starsFilter = new StarsFilter();
return starsFilter;
}
private class StarsFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
// Create a FilterResults object
FilterResults results = new FilterResults();
constraint = constraint.toString().toLowerCase();
if (constraint != null && constraint.toString().length() > 0) {
ArrayList<HashMap<String, String>> filteredStars = new ArrayList<>();
for(HashMap<String, String> item : data){
if(item.toString().toLowerCase().contains(constraint)){
filteredStars.add(item);
}
}
results.values = filteredStars;
results.count = filteredStars.size();
} else {
synchronized(this) {
results.values = data;
results.count = data.size();
}
}
// Return our FilterResults object
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
data.clear();
if (constraint.length() == 0) {
notifyDataSetInvalidated();
} else {
for (HashMap<String, String> result : (ArrayList<HashMap<String, String>>) results.values) {
data.add(result);
}
notifyDataSetChanged();
}
}
}
有什么想法吗?我很感激你的帮助。提前谢谢!
答案 0 :(得分:0)
首先,不要使用名为ArrayList
的单data
来存储初始结果和过滤结果。请注意,在发布结果中,您首先清除了data
,因此一旦用户使用搜索 - 原始数据会部分/完全丢失。
例如,您的适配器中有2 ArrayList
个名为originalData
和filteredData
。过滤期间originalData
不得更改。最初filteredData
必须是originalData
的副本,并且您的适配器必须始终使用filteredData
作为源数据集。
在执行过滤时,您必须修改/清除/填充filteredData
。如果constraint
为空字符串,则必须将所有originalData
内容复制到filteredData
。
然后在publishResults
中将支票从constraint.length() == 0
更改为results.count == 0
。