在更新位置之前,请从Google地图中删除特定标记

时间:2015-07-11 17:21:37

标签: android google-maps

我正在尝试更新Google地图中标记的位置,我将从服务器获取响应。我将标记和table_id存储在HashMap中以跟踪地图中的标记,但是在当前状态下,始终在update the Location中创建新标记而不删除旧标记。谁能看到我做错了什么?

我注意到它只适用于第一次更新后,总是会创建一个新的。

代码

public class Map extends FragmentActivity implements OnMapReadyCallback {
    GoogleMap map;
    Marker marker;
    HashMap<Integer, Marker> markerMap = new HashMap<Integer, Marker>();

        private void gotoLocation(int id, double lat, double lng,
                String route_direct) {

            final float zoom = 11;

            LatLng ll = null;

            if (markerMap.containsKey(id)) {
                // Update the location.
                marker = markerMap.get(id);
                marker.remove();

                ll = new LatLng(lat, lng);
                if (lat != 0 && lng != 0 && !route_direct.isEmpty()) {
                    MarkerOptions markerOpt = new MarkerOptions()
                            .title(route_direct).position(ll).visible(true);
                    marker = map.addMarker(markerOpt);
                    CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll,
                            zoom);
                    map.moveCamera(update);
                }

            } else {

                ll = new LatLng(lat, lng);
                if (lat != 0 && lng != 0 && !route_direct.isEmpty()) {
                    MarkerOptions markerOpt = new MarkerOptions()
                            .title(route_direct).position(ll).visible(true);
                    marker = map.addMarker(markerOpt);
                    markerMap.put(id, marker);

                    CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll,
                            zoom);
                    map.moveCamera(update);
                }

            }

        }
}

截图 enter image description here

1 个答案:

答案 0 :(得分:1)

运行代码后,我意识到问题所在。 如果标记已经存在于HashMap中,则您不会使用新的标记引用更新HashMap中的条目。

因此,如果它已经存在,只需从HashMap中删除旧的Marker条目,并使用相同的键添加新的Marker引用。

添加了两行代码,注释中包含//added

private void gotoLocation(int id, double lat, double lng,
                          String route_direct) {

    final float zoom = 11;

    LatLng ll = null;

    if (markerMap.containsKey(id)) {

        // Update the location.
        marker = markerMap.get(id);
        marker.remove();
        markerMap.remove(id); //added

        ll = new LatLng(lat, lng);
        if (lat != 0 && lng != 0 && !route_direct.isEmpty()) {
            MarkerOptions markerOpt = new MarkerOptions()
                    .title(route_direct).position(ll).visible(true);
            marker = mMap.addMarker(markerOpt);
            markerMap.put(id, marker); //added
            CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll,
                    zoom);
            mMap.moveCamera(update);
        }

    } else {

        ll = new LatLng(lat, lng);
        if (lat != 0 && lng != 0 && !route_direct.isEmpty()) {
            MarkerOptions markerOpt = new MarkerOptions()
                    .title(route_direct).position(ll).visible(true);
            marker = mMap.addMarker(markerOpt);
            markerMap.put(id, marker);

            CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll,
                    zoom);
            mMap.moveCamera(update);
        }

    }

}

此外,以下是我如何设置简单测试,只使用一个id进行测试,并在每个地图上更新它:

  mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {

        @Override
        public void onMapClick(LatLng point) {

            Log.d("MyMap", "MapClick");

            gotoLocation(1, point.latitude, point.longitude, "testing");
        }
    });