【问题标题】:remove marker when is deleted since firebase自firebase以来删除标记时删除
【发布时间】:2018-11-24 12:38:12
【问题描述】:

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

完成这项工作的正确方法是什么? 提前致谢!

【问题讨论】:

  • 请编辑您的问题(下面有一个链接)以包含setMarker 的代码。没有它就很难猜到为什么removeMarker 不起作用。
  • 我已经更新了问题

标签: android google-maps firebase-realtime-database marker


【解决方案1】:

在您的 removeMarker() 方法中,将您的代码更改为如下所示:

if (mMarkers.containsKey(key)) {
    Marker marker = mMarkers.remove(key);
    if(marker != null){
        marker.remove();
    }
}

我假设mMarkers 是HashMap。在这种情况下,使用remove(key) 删除条目将从您的HashMap 中删除该条目并返回Marker(如果不存在则返回null)。然后只需使用标记的remove 方法将其从地图中删除。

您的代码的另一个问题是您检查HashMap 是否不包含键。所以该代码可能不会执行。

编辑

您可能将mMarker 和HashMap 与Map 的Marker 混淆了。 “mMarker”对于编码来说不是一个好名字——因为它并不明显。你应该把它改成更明显的东西,比如“mMarkerMap”。

【讨论】:

  • 谢谢它已经奏效了!我会带你改进代码
猜你喜欢
  • 1970-01-01
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
相关资源
最近更新 更多