我在我的Android应用程序中有以下代码:
/**
* callback executed after fetching the data.
*/
public void OnPointsFetch(ArrayList<Shop> result) {
toggleLoader(false);
this.shops = result;
if(activeFilter == Constants.POINTS_FILTER_AVAILABLE){
for(Shop s : result){
if(s.getClientPoints().getPointsAvailable() == 0){
this.shops.remove(s);
}
}
}
else{
for(Shop s : result){
if(s.getClientPoints().getPointsSpent() == 0){
this.shops.remove(s);
}
}
}
ptsListAdapter.setCollection(this.shops);
ptsListAdapter.setFilter(this.activeFilter);
}
在异步任务的结果上调用此方法。我需要在传递给列表适配器之前删除集合的一些元素。
11-23 17:39:59.760: E/AndroidRuntime(19777): java.util.ConcurrentModificationException
11-23 17:39:59.760: E/AndroidRuntime(19777): at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:569)
答案 0 :(得分:42)
迭代时,您无法从列表中删除项目。您需要使用迭代器及其remove方法:
for(Iterator<Shop> it = result.iterator(); it.hasNext();) {
Shop s = it.next();
if(s.getClientPoints().getPointsSpent() == 0) {
it.remove();
}
}
答案 1 :(得分:1)
时通常会出现此错误
您在对集合进行迭代时直接修改集合
一个线程修改集合,而另一个线程迭代它。
答案 2 :(得分:1)
不确定接受的答案是否有效,因为内部会尝试再次修改相同的列表。更简洁的方法是维护“删除”列表,并在循环内不断向该列表添加元素。一旦我们准备好删除列表,就可以在循环后删除它们。这应该适用于我们不需要重新处理已删除元素的所有情况。如果是,则可以检查现有删除列表中是否存在该元素。
List<String> list = new ArrayList<String>();
List<String> listRemove = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
list.add("6");
list.add("7");
list.add("8");
System.out.println("list : " + list);
for (String i : list) {
if (i.equals("2")) {
listRemove.add(i);
}
}
list.removeAll(listRemove);
System.out.println("updated list: " + list);