【问题标题】:google maps, add new markers and delete old markers android谷歌地图,添加新标记并删除旧标记android
【发布时间】:2019-03-07 21:16:10
【问题描述】:

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

【问题讨论】:

  • 在这里你找到了在我的代码中添加标记的代码,我没有找到如何在这里分享代码工作正常,我只想添加新标记然后删除旧标记justpaste.it/5c4jr

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


【解决方案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 这意味着标记不存在于新列表中,应该从地图中删除

【讨论】:

  • 感谢您指出我的错误——事实上,我在循环遍历 HashMap 时尝试修改它,这是一个初学者的错误。我已经根据您提出的建议编辑了我的答案,以便提供“错误”免费代码——如果有人想在将来使用它并保持完整性。再次感谢。
  • 不客气@Barns,但不建议使用while循环,因为它永远不会停止循环,而不是使用“for”循环,我只是测试了它们,这就是我的笔记跨度>
【解决方案2】:

创建一个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;
}




解释:

第一次通过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 和地图中删除。

【讨论】:

  • HashMap markerList 每次获得 25 个新标记,而 arraylist 获得相同的 25 个新标记,所以我没有从旧标记中删除任何内容。我认为这里缺少一些东西
  • @AymenMasmoudi :: 请查看编辑后的答案。我添加了代码如何工作的“解释”和描述可能导致您的应用程序出现问题的“注释”。 :: 如果您提供您在测试中使用的代码,那么我确信问题可以得到解决。
  • 感谢您的所有解释,我唯一不明白的是 for (Bikes bike : arrayList){ 循环,如果我们假设 markerList 包含 27 个标记,arrayList 包含 25 个标记,这意味着只检查markerList中的25个标记,结果为真,其他2个标记不会被检查,所以最后什么都不会被删除。我希望如果你能提供我的测试项目,也许我能理解更多,谢谢
  • @AymenMasmoudi :: 我真诚的道歉。看一下编辑后的第二个循环。它现在循环遍历HashMap 的键并删除那些不在arrayList 中的条目。在重新输入示例代码时,我不知何故使用了错误的集合来循环遍历。它现在应该可以工作了。
【解决方案3】:

您必须做的是,在添加新标记之前,您必须通过调用 mGoogleMap.clear() 来清除地图。每次添加新标记之前,您都必须这样做。

【讨论】:

  • 这就是我已经做的并且工作正常,但是客户想要添加新标记然后删除旧标记,这是我添加标记的代码,我没有找到如何在这里分享justpaste.it/5c4jr
猜你喜欢
  • 2018-10-24
  • 2012-11-06
  • 2017-02-10
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 2016-09-24
  • 2016-10-12
  • 2015-01-30
相关资源
最近更新 更多