我在适配器中编写了一个客户过滤器,允许用户按客户名称进行搜索。我按照this question上提供的答案,特别是35个投票的答案,因为所选答案会修改原始列表并导致错误。过滤工作正常,但如果在搜索客户名称后按退格键,则结果不会更新。这是我的过滤方法,感谢您事先提供任何帮助。
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
ArrayList<CustomerView> suggestions = new ArrayList<>();
if (constraint != null) {
suggestions.clear();
for (CustomerView customer : customers) {
if (customer.getName().toLowerCase().contains(constraint.toString().toLowerCase())) {
suggestions.add(customer);
}
}
results.values = suggestions;
results.count = suggestions.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
clear();
if (results != null && results.count > 0) {
addAll((ArrayList<CustomerView>) results.values);
} else {
addAll(customers);
}
notifyDataSetChanged();
}
};
}
答案 0 :(得分:0)
为什么不创建自定义搜索机制来过滤活动或片段中的结果而不是适配器。
如果您使用的是EditText,请添加&#34; TextWatcher&#34;编辑文本。比如下面给出的链接:
How to use the TextWatcher class in Android?
如果您使用的是Searchview,则只需添加&#34; OnqueryTextChangeListener&#34;到你的serchview。比如下面的链接:
how to get the events of searchview in android
根据您的要求添加一些过滤机制,如下面的示例代码:
@Override
public boolean onQueryTextChange(String s) {
textlength = s.length();
arr_sort.clear();
for (int i = 0; i < tunesList.size(); i++) {
String heading = (String) tunesList.get(i).
getTuneName();
String[] words = heading.split("\\s+");
for (String item : words) {
Log.e("Words" , item);
if (s.length() <= (int) item.length()) {
if (s.equalsIgnoreCase((String) item.subSequence(0, s.length())))
{
RowItemMain cObj = tunesList.get(i);
if(arr_sort.contains(cObj))
{
}else{
arr_sort.add(cObj);
}
}
}
}
}
try
{
AdapterMain ivAdp = new AdapterMain(MainActivity.this, arr_sort);
lvSounds.setAdapter(ivAdp);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}