自 firebase 删除时删除标记
remove marker when is deleted since firebase
我是 Android 的新手,我遵循了这个教程:
https://codelabs.developers.google.com/codelabs/realtime-asset-tracking/index.html#0
为了实时跟踪,好吧,我的问题是在firebase中删除标记时如何从地图中删除标记,代码如下:
private void subscribeToUpdates() {
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("locations").child("unidad_1");
ref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
setMarker(dataSnapshot);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
setMarker(dataSnapshot);
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
removeMarker(dataSnapshot);
}
@Override
public void onCancelled(DatabaseError error) {
Log.d(TAG, "Failed to read value.", error.toException());
}
});
}
private void removeMarker(DataSnapshot dataSnapshot) {
String key = dataSnapshot.getKey();
HashMap<String, Object> value = (HashMap<String, Object>) dataSnapshot.getValue();
if (!mMarkers.containsKey(key)) {
mMarkers.remove(key);
}
}
private void setMarker(DataSnapshot dataSnapshot) {
// When a location update is received, put or update
// its value in mMarkers, which contains all the markers
// for locations received, so that we can build the
// boundaries required to show them all on the map at once
String key = dataSnapshot.getKey();
HashMap<String, Object> value = (HashMap<String, Object>) dataSnapshot.getValue();
double lat = Double.parseDouble(value.get("latitude").toString());
double lng = Double.parseDouble(value.get("longitude").toString());
LatLng location = new LatLng(lat, lng);
if (!mMarkers.containsKey(key)) {
mMarkers.put(key, mMap.addMarker(new MarkerOptions().title(key).position(location)));
} else {
mMarkers.get(key).setPosition(location);
}
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : mMarkers.values()) {
builder.include(marker.getPosition());
}
mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), 0));
}
完成这项工作的正确方法是什么?
提前致谢!
在您的 removeMarker()
方法中,将您的代码更改为如下所示:
if (mMarkers.containsKey(key)) {
Marker marker = mMarkers.remove(key);
if(marker != null){
marker.remove();
}
}
我假设 mMarkers
是 HashMap
。在这种情况下,使用 remove(key)
删除条目将从 HashMap
和 return 和 Marker
中删除条目(如果不存在则为 null)。然后只需使用标记的 remove
方法将其从地图中删除即可。
您的代码的另一个问题是您检查 HashMap
是否不包含 键 。因此该代码可能不会执行。
编辑
您可能混淆了 mMarker
HashMap
和 Map
的 Marker
。 "mMarker" 不是编码的好名称——因为它不明显。您应该将其更改为更明显的内容,例如 "mMarkerMap".
我是 Android 的新手,我遵循了这个教程: https://codelabs.developers.google.com/codelabs/realtime-asset-tracking/index.html#0
为了实时跟踪,好吧,我的问题是在firebase中删除标记时如何从地图中删除标记,代码如下:
private void subscribeToUpdates() {
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("locations").child("unidad_1");
ref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
setMarker(dataSnapshot);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
setMarker(dataSnapshot);
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
removeMarker(dataSnapshot);
}
@Override
public void onCancelled(DatabaseError error) {
Log.d(TAG, "Failed to read value.", error.toException());
}
});
}
private void removeMarker(DataSnapshot dataSnapshot) {
String key = dataSnapshot.getKey();
HashMap<String, Object> value = (HashMap<String, Object>) dataSnapshot.getValue();
if (!mMarkers.containsKey(key)) {
mMarkers.remove(key);
}
}
private void setMarker(DataSnapshot dataSnapshot) {
// When a location update is received, put or update
// its value in mMarkers, which contains all the markers
// for locations received, so that we can build the
// boundaries required to show them all on the map at once
String key = dataSnapshot.getKey();
HashMap<String, Object> value = (HashMap<String, Object>) dataSnapshot.getValue();
double lat = Double.parseDouble(value.get("latitude").toString());
double lng = Double.parseDouble(value.get("longitude").toString());
LatLng location = new LatLng(lat, lng);
if (!mMarkers.containsKey(key)) {
mMarkers.put(key, mMap.addMarker(new MarkerOptions().title(key).position(location)));
} else {
mMarkers.get(key).setPosition(location);
}
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : mMarkers.values()) {
builder.include(marker.getPosition());
}
mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), 0));
}
完成这项工作的正确方法是什么? 提前致谢!
在您的 removeMarker()
方法中,将您的代码更改为如下所示:
if (mMarkers.containsKey(key)) {
Marker marker = mMarkers.remove(key);
if(marker != null){
marker.remove();
}
}
我假设 mMarkers
是 HashMap
。在这种情况下,使用 remove(key)
删除条目将从 HashMap
和 return 和 Marker
中删除条目(如果不存在则为 null)。然后只需使用标记的 remove
方法将其从地图中删除即可。
您的代码的另一个问题是您检查 HashMap
是否不包含 键 。因此该代码可能不会执行。
编辑
您可能混淆了 mMarker
HashMap
和 Map
的 Marker
。 "mMarker" 不是编码的好名称——因为它不明显。您应该将其更改为更明显的内容,例如 "mMarkerMap".