我对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 ++;
}
}
}
}
答案 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)
当您尝试同时迭代和修改集合时,会发生此异常。 所以我建议采取另一个列表,其中包含要删除的项目。 而迭代再次只删除。