我正在尝试将搜索功能添加到具有自定义适配器的ListView。当我在EditText中键入内容时,它会搜索并显示结果,但是如果我尝试删除我刚才写的内容,它将不会出现初始列表,它将保留已经过滤的列表。 这是代码:
在MainActivity中:
private TextWatcher searchTextWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
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) {
}
};
在LazyAdapter中:
public Filter getFilter() {
return new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
data = (ArrayList<HashMap<String, String>>) results.values;
LazyAdapter.this.notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
ArrayList<HashMap<String, String>> filteredResults = getFilteredResults(constraint);
FilterResults results = new FilterResults();
results.values = filteredResults;
return results;
}
};
}
protected ArrayList<HashMap<String, String>> getFilteredResults(
CharSequence constraint) {
ArrayList<HashMap<String, String>> filteredTeams = new ArrayList<HashMap<String, String>>();
for(int i=0;i< data.size();i++){
if(data.get(i).get(MainActivity.KEY_TITLE).toLowerCase().startsWith(constraint.toString().toLowerCase())){
filteredTeams.add(data.get(i));
}
}
return filteredTeams;
}
我的代码出了什么问题? 谢谢!
答案 0 :(得分:4)
意识到当您过滤时,您正在使用过滤结果替换ArrayList
中的未过滤结果。当您按退格键删除字符时,您现在尝试根据已经过滤的列表进行过滤,这就是您的结果不会更改的原因。您需要保留对未应用任何过滤器的原始数据集的引用,并始终使用该数据集进行过滤,但永远不要更改/替换它。