简体   繁体   中英

google maps, add new markers and delete old markers android

in my application i get 25 markers from the webservice, and i add them to the map, then when user move the map i detect the center position and i get new 25 markers to add them in the map. the process must be: 1-get 25 markers from webservice 2-add the 25 markers to the map 3-when map move, detect the center position 4-get new 25 markers 5-add the new 25 markers to the map 6-delete the old 25 markers from the map my problem is in number 6, how can i delete the 25 old markers after adding the 25 new markers. i hope that i can find any helpful ideas, and thank you

@Barns thank you for your help, that loop doesn't work and i get this error java.util.HashMap$HashIterator.nextEntry, so i change it with this loop and finnaly it works

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

for SearchBike(bikeId) i create it because i can't use arrayList.contain() because the result is an object not a string

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

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

    return i;
}

so if i==0 that's mean the marker doesn't exist in the new list and should be deleted from the map

What you must do is, before adding the new markers, you must clear the map by calling mGoogleMap.clear() . And you have to do this every time before adding the new markers.

Create a HashMap class variable to hold information about the markers:

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

(I assume bike.getId() returns a long type, but if you have used a different type you must change the definition of the HashMap and the following code to reflect that type.)

After the for (Bikes bike : arrayList) loop is run go through all the values in the markerList and remove the Markers that aren't in the arrayList.

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:

The first time through addMarkers() : The markerList is empty so in line if(!markerList.containsKey(bike.getId())){ a new entry will be added every pass through the first loop for (Bikes bike : arrayList){ . And the Marker will be added to the map. In the second loop for (Long key : markerList.keySet()){ we iterate through the HashMap and if the arrayList does not contain the "key" then it is removed from the markerList and from the map. But, because this is the first time through, nothing will be removed.

The second time through the addMarkers() method different bike locations are present in the arrayList containing the Bike data which should have bikes with different "id" values than the first time around--at least for some bikes.

This time when if(!markerList.containsKey(bike.getId())){ is called some of the values for bike.getId() will still be in the markerList --> nothing is done! But, some bike.getId() values will not be in the list--> these will be add to the list and markers added to the map. This means you will have more than 25 markers and more than 25 elements in markerList .

In the second loop for (Long key : markerList.keySet()){ a check is performed to see if the arrayList contains the keys from the markerList . If not in arrayList then that marker is removed from the markerList and the from the map.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM