如何将Marker的ArrayList添加到Google Map?解决标记覆盖问题
解决Google Map循环添加标记仅显示最后一个的问题
嗨,我看你遇到的问题其实有两个关键地方要修正:一个是循环里数组对象重复引用导致数据被覆盖,另一个是关于Marker批量添加的误区(其实根本不需要类似Polyline的addAll方法)。
先说说你代码里的核心bug
你在循环外创建了arrayOfGreenDots这个数组,每次循环只是修改它的元素再把它加到arrayListOfGreenDots里。这就导致集合里的所有元素都是同一个数组对象,循环结束时,所有数组元素的值都会变成最后一次循环的内容——这就是为什么你看到所有标记都变成最后一个的原因!
修正方案1:修复数据存储问题
把arrayOfGreenDots的创建移到循环内部,每次循环都新建一个数组,避免重复引用:
// 原循环部分修改 for (int i = 0; i < arrayOfGpsData.size(); i++) { // 简化条件,不用写<= size-1 gpsDataObj = arrayOfGpsData.get(i); tempCoordinatesArray = gpsDataObj.getArrayOfDoubles(); tempDurationAndTimeArray = gpsDataObj.getArrayOfStrings(); latitude = tempCoordinatesArray[0]; longitude = tempCoordinatesArray[1]; coordList.add(new LatLng(latitude,longitude)); time = tempDurationAndTimeArray[0]; String latString = String.valueOf(latitude); String longString = String.valueOf(longitude); // 关键:每次循环新建数组,避免复用同一个对象 String[] arrayOfGreenDots = new String[3]; arrayOfGreenDots[0] = latString; arrayOfGreenDots[1] = longString; arrayOfGreenDots[2] = time; arrayListOfGreenDots.add(arrayOfGreenDots); }
修正后,你原来的标记添加逻辑就能正常工作了,因为arrayListOfGreenDots里的每个元素都是独立数组,保存了不同的坐标数据。
修正方案2:更高效的写法(跳过中间存储)
其实你完全可以省掉arrayListOfGreenDots这个中间集合,直接在第一次处理GPS数据的循环里就创建并添加标记,既避免了数据覆盖问题,又减少了不必要的字符串转换:
List<Marker> markers = new ArrayList<Marker>(); coordList.clear(); mMap.clear(); // 合并逻辑,直接在循环中处理坐标、折线和标记 for (int i = 0; i < arrayOfGpsData.size(); i++) { gpsDataObj = arrayOfGpsData.get(i); tempCoordinatesArray = gpsDataObj.getArrayOfDoubles(); tempDurationAndTimeArray = gpsDataObj.getArrayOfStrings(); double latitude = tempCoordinatesArray[0]; double longitude = tempCoordinatesArray[1]; LatLng currentLatLng = new LatLng(latitude, longitude); // 添加到折线坐标列表 coordList.add(currentLatLng); // 创建并添加标记到地图,同时保存到集合 Marker greenMarker = mMap.addMarker(new MarkerOptions() .position(currentLatLng) .icon(BitmapDescriptorFactory.fromResource(R.drawable.green_dot)) .title(tempDurationAndTimeArray[0])); markers.add(greenMarker); } // 后续的折线创建、首尾标记添加逻辑保持不变 if(polylineGPS != null){ polylineGPS.remove(); } PolylineOptions options = new PolylineOptions().addAll(coordList).width(5).color(Color.BLUE).geodesic(true); polylineGPS = mMap.addPolyline(options); // ... 首尾标记和地图缩放逻辑 ...
关于Marker的addAll误区
Google Maps Android SDK确实没有给Marker提供addAll方法,但这完全不是问题——逐个添加标记是标准做法,只要你的数据正确(没有被覆盖),所有标记都会正常显示在地图上。你用List<Marker>保存标记引用,后续也能方便地对这些标记进行批量操作(比如隐藏、删除等)。
内容的提问来源于stack exchange,提问作者asus
相关产品推荐
相关产品推荐

