每个 android 处的 ConcurrentModificationException

ConcurrentModificationException at for each android

我正在传递 ParseObjectArraylist,然后我放置一个 foreach 循环来提取条件为用户对象不等于 null 的项目。我面临两个问题。 1. 如果我通过将不同的数据传递到另一个列表然后将该列表传递到我的适配器来执行以下代码行,我将获得带有数字的随机数据,例如:如果在项目 # 1 上,名称是 "MAC"然后它显示在项目 3 中。

ArrayList<ParseObject> checkRequestedNetArrayList = new ArrayList<ParseObject>();
requestedNetArrayList = (ArrayList<ParseObject>) objects;
MyResponsibilitesActivity.requestedNetArrayList = requestedNetArrayList;
adapterRequest = new GenericAdapter<ParseObject>(
    getApplicationContext(),
    requestedNetArrayList,
    R.layout.requested_trust_net_list_item,
    requestedDataBinder);

requestListView.setAdapter(adapterRequest);

requestedNetArrayList = (ArrayList<ParseObject>) objects;

for(ParseObject object: objects){
    System.out.println(object);
    object.getParseObject("user");
    if(object.has("user")){

        checkRequestedNetArrayList.add(object);

    }else{
        checkRequestedNetArrayList.remove(object);
    }

}

adapterRequest = new GenericAdapter<ParseObject>(
    getApplicationContext(),
    checkRequestedNetArrayList,
    R.layout.requested_trust_net_list_item,
requestedDataBinder);

requestListView.setAdapter(adapterRequest);
  1. 如果我正在执行以下代码行来直接给出同一列表中的项目,我将得到 java.util.ConcurrentModificationException

    for(ParseObject object: objects){
    
        if(object.has("user")){
    
            requestedNetArrayList.add(object);
    
        }
    }
    else{
        requestedNetArrayList.remove(object);
    }
    
    adapterRequest = new GenericAdapter<ParseObject>(
        getApplicationContext(),
        requestedNetArrayList,
        R.layout.requested_trust_net_list_item,
        requestedDataBinder);
    
    requestListView.setAdapter(adapterRequest);
    

    }

请帮帮我。

您无法在访问列表时从列表中删除元素。 你必须使用迭代器。

无论在何处删除对象,请使用 it.remove();

Iterator<ParseObject> it = objects.iterator();
while(it.hasNext()){
    Object object = it.next();
    //your stuff
    it.remove();
}

我想你可能还想查看这篇关于 deep copy 的文章。

更新

由于您想将元素添加到列表中,因此无法直接使用迭代器。现在您面临问题,因为您直接将 objects 分配给 requestedNetArrayList 而不是按以下方式进行分配:

    ArrayList<ParseObject> requestedNetArrayList = new ArrayList<>(objects);

然后像现在一样遍历 objects,然后从中删除或添加到 requestedNetArrayList(您几乎已经在做)。

不是将对象的引用分配给 requestedNetArrayList, 创建一个具有相同内容的新 ArrayList

requestedNetArrayList=new ArrayList<ParseObject>(objects);

然后您可以迭代对象并修改 requestedNetArrayList。

当您使用 for-each 构造 Collection 进行迭代时

for (Object x : collection) ...

您已为该集合隐式创建 Iterator 对象。此迭代器执行检查:自创建迭代器后集合是否已更改?如果是这样,抛出异常。所以,你应该避免对你的集合进行任何修改,直到迭代器完成。这意味着,您不应该使用添加和删除。

无论哪种方式,最好通过索引访问ArrayList,因为它会阻止创建Iterator 对象。像这样:

for (int i = objects.size() - 1; i >= 0; i--) {
    ParseObject object = objects.get(i);
    // when iterating from tail to head, you can safely add or remove objects to/from this array list
}