You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:47:57