java - 即使使用迭代器,添加到我的数组列表也会导致 ConcurrentModificationException

标签 java android google-maps arraylist

在添加之前,每个循环都可以正常工作,但删除则不然,所以我使用了迭代器。现在,我添加到 arrayList 的每第三个项目都会给我一个 ConcurrentModificationException 。问题出在哪里?

private ArrayList<Marker> mMarkers它在 onCreate 中实例化

这里我有一个关于我的 onCreateView 的 ListView

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

最佳答案

无论使用 for-each 还是迭代器,都无法在迭代列表时修改列表。在异常页面上了解更多信息:http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html

关于java - 即使使用迭代器,添加到我的数组列表也会导致 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29589110/

相关文章:

java - 如何防止此结构在 JNI 调用中泄漏内存?

java - 使用项目数组初始化 HashMap?

javascript - 无法删除 Google Map v3 中的所有标记

javascript - angularJS:谷歌地图未加载地点API

java - 绘制 donut 谷歌地图Android

Java.NIO 写混淆

java - 有序持久缓存

android - 与 GooglePlayServicesUtil 的奇怪对话

Android - 滑动标签 viewpager 问题

java - 如何显示文件中的所有文本行而不是停在行尾?