数组列表中的 java.util.ConcurrentModificationException

标签 java android arraylist

我对 android 很陌生,在使用 ArrayList 时遇到了困难。我在代码中使用了 arrayList 。在某些情况下,我更新数组列表值。但是当我尝试从该数组列表中检索数据时,我收到 java.util.ConcurrentmodificationException 。我试图尽我所能解决这个问题。但我实在解决不了。这就是我在这里问的原因。请帮帮我 。

声明:

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 ++;
}
}
}
}

最佳答案

在第一 block 代码中,您迭代了 subPlayerAndCountForBackArrow 并对其进行了修改(通过调用 iter.remove)。 p>

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 
[...]

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

关于数组列表中的 java.util.ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22421316/

相关文章:

android - Android 中的缓冲图像

Java Android Arraylist字符串到ArrayList自定义类

java - 将.ttf文件添加到java项目中

java - 在Java程序中运行Logstash

java - 改造返回一个空的响应主体

android - 直接链接到 Google Play 上的应用

java - Android ArrayList 删除只是简单不起作用

java - 将元素添加到 ArrayList 时,索引 : 4, 大小处的 IndexOutOfBoundsException:4

java - 在 persistence.xml 中外部化动态属性

java - 如何使用 Intent 共享从 firebase 服务器获取的数据(图像、标题和描述)...?