google maps,添加新标记并删除旧标记android

时间:2018-10-02 17:34:21

标签: android google-maps google-maps-markers

在我的应用程序中,我从Web服务中获取了25个标记,然后将它们添加到地图中,然后当用户移动地图时,我检测到中心位置,并获得了新的25个标记以将它们添加到地图中。该过程必须是: 从Web服务中获得25个标记 2-将25个标记添加到地图 3-当地图移动时,检测中心位置 4个新的25个标记 5-将新的25个标记添加到地图 6从地图上删除旧的25个标记 我的问题是数字6,在添加25个新标记后,如何删除25个旧标记。 我希望我能找到任何有用的想法,谢谢

3 个答案:

答案 0 :(得分:1)

@Barns谢谢您的帮助,该循环不起作用,并且我收到此错误java.util.HashMap $ HashIterator.nextEntry,因此我通过此循环对其进行了更改,并最终成功了

for (Iterator<Map.Entry<String, Marker>> iterator = markerList.entrySet().iterator(); iterator.hasNext();){
        Map.Entry<String, Marker> entry = iterator.next();
        //Log.e("key", entry.getKey()+"");
        String bikeId = entry.getKey();
        int i = SearchBike(bikeId);
        //Log.e("i",i+"");
        if (i == 0) {
            Marker marker = entry.getValue();
            marker.remove();
            iterator.remove();
            markerList.remove(bikeId);
        }
    }

对于SearchBike(bikeId)我创建它是因为我不能使用arrayList.contain(),因为结果是对象而不是字符串

private int SearchBike(String id){
    int i = 0;

    for (Bikes bike : arrayList){
        if (bike.getId().equals(id)) {
            i++;
        }
    }

    return i;
}

因此,如果i == 0,则表示该标记在新列表中不存在,应从地图中删除

答案 1 :(得分:0)

您必须做的是,在添加新标记之前,您必须通过调用mGoogleMap.clear()清除地图。而且,您每次必须执行此操作,然后才能添加新标记。

答案 2 :(得分:0)

创建一个HashMap类变量以保存有关标记的信息:

HashMap<Long, Marker> markerList = new HashMap<>();

(我假设bike.getId()返回一个long类型,但是如果您使用了其他类型,则必须更改HashMap的定义以及以下代码以反映该类型。)

运行for (Bikes bike : arrayList)循环后,遍历markerList中的所有值并删除arrayList中没有的Markers

private void addMarkers(){
    //set Markers of bikes list
    //First loop!!
    for (Bikes bike : arrayList){
        BitmapDescriptor pinMarker = null;
        LatLng latLng = new LatLng(Double.parseDouble(bike.getLatitude()),Double.parseDouble(bike.getLongitude()));

        switch (bike.getBreakdown()){
            case "false":
                pinMarker = pinWork;
                break;
            case "true":
                pinMarker = pinMaintenance;
                break;
        }

        Marker marker = VelosMap.addMarker(new MarkerOptions()
            .position(latLng)
            .icon(pinMarker)
            .zIndex(1));

        if(!markerList.containsKey(bike.getId())){
            Marker marker = map.addMarker(marker);

            //Add the marker to the marker list 
            markerList.put(bike.getId(), marker);

            HashMap<String,String>data=new HashMap<String,String>();
            data.put("id",bike.getId());
            data.put("imei",bike.getImei());
            data.put("inUse",bike.getInUse());
            data.put("breakdown",bike.getBreakdown());
            marker.setTag(data);
        }
    }

    // This will iterate through all the items in the new list ...
    //...and remove the markers that are not found in the new list
    // Second Loop!!
    Iterator<Long> it = markerList.keySet().iterator();
    while(it.hasNext();){
        Long key = it.next();
        if(!bikeContains(key)){
            Marker marker = markerList.remove(key);
            marker.remove();
        }
    }
}


private boolean bikeContains(Long id){
    for (Bikes bike : arrayList){
        Long bikeId = bike.getId();
        if(bikeId == id){
            return true;
        }
    }
    return false;
}




EXPLANATION:

第一次通过addMarkers()markerList为空,因此在第if(!markerList.containsKey(bike.getId())){行中,每经过第一个循环for (Bikes bike : arrayList){都会添加一个新条目。并且Marker将被添加到地图中。在第二个循环for (Long key : markerList.keySet()){中,我们遍历HashMap,如果arrayList不包含“键”,则将其从markerList和地图中删除。但是,因为这是第一次,所以不会删除任何内容。

第二次通过addMarkers()方法,包含arrayList数据的Bike中出现了不同的自行车位置,该数据应具有与第一次自行车不同的“ id”值- -至少对于某些自行车。

这一次,当调用if(!markerList.containsKey(bike.getId())){时,bike.getId()的某些值仍将在markerList中->什么也没做!但是,某些bike.getId()值将不在列表中->这些值将添加到列表中,并将标记添加到地图中。这意味着markerList中将有25个以上的标记和25个以上的元素。

在第二个循环for (Long key : markerList.keySet()){中,将执行一次检查以查看arrayList是否包含来自markerList的密钥。如果不在arrayList中,则会从markerList和地图中删除该标记。