在为每个循环添加正常工作之前,但是删除不是这样我使用了迭代器。现在我添加到arrayList的每个第3项都给了ConcurrentModificationException
。什么似乎是问题?
private ArrayList<Marker> mMarkers
中实例化的 onCreate
我在onCreateView
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
final Events event = mEventsParseQueryAdapter.getItem(position);
GoogleMap googleMap = mSupportMapFragment.getMap();
if (mMarkers.isEmpty()) {
mMarkers.add(googleMap.addMarker(new MarkerOptions()
.position(getLatLngFromGeoPoint(event.getLocation()))));
} else {
Iterator<Marker> markerIterator = mMarkers.iterator();
//noinspection WhileLoopReplaceableByForEach
while (markerIterator.hasNext()) {
Marker marker = markerIterator.next();
if (marker.getPosition().equals(getLatLngFromGeoPoint(event.getLocation()))) {
return false;
} else {
mMarkers.add(googleMap.addMarker(new MarkerOptions()
.position(getLatLngFromGeoPoint(event.getLocation()))));
}
}
}
return true;
}
});
这是我在点击监听器上的标记,它会弹出一个对话框,并有一个删除标记的选项
googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(final Marker marker) {
googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(marker.getPosition(), CONSTANT.ZOOM_LEVEL));
AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity());
dialog.setNegativeButton(R.string.checkout, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
mMarkers.remove(marker);
marker.remove();
}
}).setPositiveButton(R.string.frames, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.create().show();
return true;
}
});
答案 0 :(得分:2)
无论是使用for-each还是迭代器,都无法在迭代时修改列表。阅读例外页面上的更多内容:http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html
答案 1 :(得分:1)
mMarkers.add(googleMap.addMarker(new MarkerOptions()
在迭代循环(while (markerIterator.hasNext()))
内部调用,因此在遍历集合时添加元素会导致错误。
其实你可能想要:
} else {
mMarkers.add(googleMap.addMarker(new MarkerOptions()
.position(getLatLngFromGeoPoint(event.getLocation()))));
}
分支不在循环内部,但在整个while循环之外rahter(当没有找到现有标记时,创建并添加新标记。
答案 2 :(得分:0)
您正在使用故障快速迭代器(casE中的markerIterator)同时解析/添加或读取/写入列表。如果迭代器将在代码中检测到这种行为,它将抛出此异常。
一个线程通常不允许修改Collection而另一个线程迭代它
因此,您的读/写操作应该取消关联,时间老虎。