@覆盖
protected FilterResults performFiltering(CharSequence constraint) {
if(constraint != null) {
suggestions.clear();
for (DrugsInfo customer : itemsAll) {
if(customer.getDRUGNAME().toLowerCase().startsWith(constraint.toString().toLowerCase())){
suggestions.add(customer);
}
}
FilterResults filterResults = new FilterResults();
filterResults.values = suggestions;
filterResults.count = suggestions.size();
return filterResults;
} else {
return new FilterResults();
}
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
ArrayList<DrugsInfo> filteredList = (ArrayList<DrugsInfo>) results.values;
if(results != null && results.count > 0) {
clear();
for (DrugsInfo c : filteredList) {
add(c);
}
notifyDataSetChanged();
}
}
};
我在这里得到一个Concurrent Modification异常.Plz建议如何解决..
此行中的错误(DrugsInfo c:filteredList){
答案 0 :(得分:0)
我正在看这段代码:
suggestions.clear();
for (DrugsInfo customer : itemsAll) {
if(customer.getDRUGNAME().toLowerCase().startsWith(constraint.toString().toLowerCase())){
suggestions.add(customer);
}
}
并注意到您正在清除现有列表(显然是类属性,而不是局部变量),而不是在此处创建新的空列表。我愿意打赌你的suggestions
列表是支持适配器的实际列表。如果我是对的,那么这就是发生的事情:
performFiltering()
中您将suggestions
分配给filterResults.values
。现在filterResults.values
。现在filterResults.values
包含对适配器源列表的引用。publishResults()
中,您将results.values
(来自filterResults.values
)分配给filteredList
。现在filteredList
包含对适配器源列表的引用。ConcurrentModificationException
;您无法与活动迭代器同时修改列表。)add(c)
使适配器添加到适配器源列表 - 你知道,你正在迭代的那个。我已经通过Android开发了解到你必须非常小心地将列表分配给其他列表变量。很容易忘记另一个变量实际上是同一个列表。
您应该可以通过将上面的代码段更改为:
来解决此问题 ArrayList<DrugsInfo> tempList = new ArrayList<>();
for (DrugsInfo customer : itemsAll) {
if(customer.getDRUGNAME().toLowerCase().startsWith(constraint.toString().toLowerCase())){
tempList.add(customer);
}
}
FilterResults filterResults = new FilterResults();
filterResults.values = tempList;
filterResults.count = tempList.size();
哦,顺便说一句,你可以替换这段代码
for (DrugsInfo c : filteredList) {
add(c);
}
与
addAll(filteredList);