我在这里得到一个Concurrent Modification异常.Plz建议如何解决

时间:2016-03-06 04:34:02

标签: android exception concurrency

@覆盖

    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){

1 个答案:

答案 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包含对适配器源列表的引用。
  • 接下来,通过在列表上运行for-each循环来创建迭代器。所以现在你在后备列表上有一个迭代器。迭代器正在执行其操作时无法修改列表(因此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);