每个android

时间:2015-07-04 13:48:00

标签: java android list concurrentmodification

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

foreach
  1. 如果我正在执行以下代码行,只是直接在同一列表中提供项目,那么我将获得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);

    java.util.ConcurrentModificationException

    }

  2. 请帮帮我。

3 个答案:

答案 0 :(得分:5)

访问时无法从列表中删除元素。 你必须使用Iterator。

除非删除对象,请使用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(你几乎已经在做了)。

答案 1 :(得分:1)

使用for-each的每个构造进行迭代时

for (Object x : collection) ...

您已为该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
}

答案 2 :(得分:0)

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

requestedNetArrayList=new ArrayList<ParseObject>(objects);

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