从数组列表中删除元素后java.util.ConcurrentModificationException android

时间:2012-11-23 17:46:09

标签: android exception arraylist java.util.concurrent

我在我的Android应用程序中有以下代码:

/**
 * callback executed after fetching the data.
 */
public void OnPointsFetch(ArrayList<Shop> result) {

    toggleLoader(false);

    this.shops = result;

    if(activeFilter == Constants.POINTS_FILTER_AVAILABLE){
        for(Shop s : result){
            if(s.getClientPoints().getPointsAvailable() == 0){
                this.shops.remove(s);
            }
        }
    }
    else{
        for(Shop s : result){
            if(s.getClientPoints().getPointsSpent() == 0){
                this.shops.remove(s);
            }   
        }
    }


    ptsListAdapter.setCollection(this.shops);
    ptsListAdapter.setFilter(this.activeFilter);

}

在异步任务的结果上调用此方法。我需要在传递给列表适配器之前删除集合的一些元素。

    11-23 17:39:59.760: E/AndroidRuntime(19777): java.util.ConcurrentModificationException
11-23 17:39:59.760: E/AndroidRuntime(19777):    at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:569)

3 个答案:

答案 0 :(得分:42)

迭代时,您无法从列表中删除项目。您需要使用迭代器及其remove方法:

for(Iterator<Shop> it = result.iterator(); it.hasNext();) {
    Shop s = it.next();
    if(s.getClientPoints().getPointsSpent() == 0) {
        it.remove();
    }   
}

答案 1 :(得分:1)

时通常会出现此错误
  1. 您在对集合进行迭代时直接修改集合

  2. 时甚至更糟
  3. 一个线程修改集合,而另一个线程迭代它。

答案 2 :(得分:1)

不确定接受的答案是否有效,因为内部会尝试再次修改相同的列表。更简洁的方法是维护“删除”列表,并在循环内不断向该列表添加元素。一旦我们准备好删除列表,就可以在循环后删除它们。这应该适用于我们不需要重新处理已删除元素的所有情况。如果是,则可以检查现有删除列表中是否存在该元素。

    List<String> list = new ArrayList<String>();
    List<String> listRemove = new ArrayList<String>();

    list.add("1");
    list.add("2");
    list.add("3");
    list.add("4");
    list.add("5");
    list.add("6");
    list.add("7");
    list.add("8");

    System.out.println("list : " + list);

    for (String i : list) {
        if (i.equals("2")) {
            listRemove.add(i);
        }
    }
    list.removeAll(listRemove);
    System.out.println("updated list: " + list);