我正在尝试更新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);
}
}
}
}
截图
答案 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");
}
});