数组列表中的java.util.ConcurrentModificationException

时间:2014-03-15 08:12:00

标签: java android arraylist

我对android很新,我在使用ArrayList时遇到了困难。我在代码中使用了一个arrayList。在某些情况下,我更新了arraylist值。但是当我尝试从该数组列表中检索数据时,我得到了java.util.Concurrent修改异常。我试图尽我所能解决这个问题。但我真的无法解决。这就是我在这里问的原因。请帮帮我 。

声明:

HashMap<String,List<Player>> subPlayerAndCountForBackArrow = new HashMap<String, List<Player>>();

以下是我用来更新arrayList中的数据的代码:

Iterator<Player> iter = subPlayerAndCountForBackArrow.get(String.valueOf(imanopage)).iterator();
while   (iter.hasNext()) {
if (iter.next().getTag().toString().equals(old_Parent.getChildAt(0).getTag().toString())){       
iter.remove();
    }
}
subPlayerAndCountForBackArrow.get(String.valueOf(imanopage)).add((Player)isGoal.getChildAt(0));

这是我用来从arrayList中检索数据的代码:

if(v.getId()==R.id.imgRightArrow){
if(subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).size()>0){  //this is the error line 
Log.i("UpArrowUpArrowUpArrow", "UpArrow");
if(imanopage <= subPlayerAndCountForBackArrow.size()){
        subPlayer1.removeAllViews();
subPlayer2.removeAllViews();
subPlayer3.removeAllViews();
subPlayer4.removeAllViews();
for(int j = 0;j<subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).size();j++){

if(j == 0){
subPlayer1.addView(subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).get(j));
RelativeLayout.LayoutParams lp=(RelativeLayout.LayoutParamssubPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).get(j).getLayoutParams();
     lp.addRule(RelativeLayout.CENTER_IN_PARENT);
     lp.width = 50;
     lp.height = 45;

}

if(j == 1){
subPlayer2.addView(subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).get(j));
      RelativeLayout.LayoutParams lp=(RelativeLayout.LayoutParams)subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).get(j).getLayoutParams();
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
lp.width = 50;
lp.height = 45;
}

if(j == 2){
subPlayer3.addView(subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).get(j));
RelativeLayout.LayoutParams lp=(RelativeLayout.LayoutParams)subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).get(j).getLayoutParams();
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
lp.width = 50;
lp.height = 45;
}

if(j == 3){
subPlayer4.addView(subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).get(j));
RelativeLayout.LayoutParams lp=(RelativeLayout.LayoutParams)subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).get(j).getLayoutParams();
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
lp.width = 50;
lp.height = 45;
}
}
if(imanopage == subPlayerAndCountForBackArrow.size()){
}
      else{
imanopage ++;
}
}
}
}

3 个答案:

答案 0 :(得分:1)

在第一段代码中,您已经迭代了subPlayerAndCountForBackArrow 修改了它(通过调用iter.remove)。

Iterator<Player> iter = subPlayerAndCountForBackArrow.get(String.valueOf(imanopage)).iterator();
[...]
iter.remove();

不同的代码块在同一个列表上迭代(我单独假设):

[...]
if(subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).size()>0){  //this is the error line 
[...]

你做不到。您无法迭代同时修改的列表。这就是异常告诉你的。

答案 1 :(得分:0)

在迭代时,您无法从列表中删除项目。

我看到的最佳解决方案是创建第二个列表,将要删除的项添加到第二个列表中。然后迭代您的第二个列表,并为每个项目从第一个列表中删除它。完成后,清除第二个列表。此时,您要删除的项目不应有任何引用。

这是一些代码,第一个循环检查是否应该删除该项并将其添加到删除列表中。下一个循环完全删除它们。

    for (int i = 0; i < myList.size(); ++i) {
        Item item = myList.get(i);
        if (item.isValid()) {
            item.doStuff();
        } else {
            nulledItems.add(item);
        }
    }

    if (!nulledItems.isEmpty()) {
        for (Item item : nulledItems) {
            if (myList.contains(item)) {
                myList.remove(item);
            }
        }
        nulledItems.clear();
    }

答案 2 :(得分:0)

当您尝试同时迭代和修改集合时,会发生此异常。 所以我建议采取另一个列表,其中包含要删除的项目。 而迭代再次只删除。