【问题标题】:Remove previous marker删除前一个标记
【发布时间】:2017-02-10 16:20:23
【问题描述】:

我遇到了麻烦。我在 Realtime Firebase 中获取我的纬度和经度并创建了一个标记,但每次纬度和经度有更新时,它都会创建另一个标记。

如何删除之前的标记?这是我的代码:

passRef = new Firebase(Config.FIREBASE_URL_PASSENGER);
passRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot snapShot : dataSnapshot.getChildren()) {
            for (int cnt = 0; cnt <= dataSnapshot.getChildrenCount(); cnt++) {
                if (snapShot.child("latitude").exists() && snapShot.child("longitude").exists() && snapShot.child("destination").exists()) {

                    passUsername = snapShot.child("name").getValue().toString();
                    //getting the passenger's current location
                    locLatPass = Double.valueOf(snapShot.child("latitude").getValue().toString());
                    locLongPass = Double.valueOf(snapShot.child("longitude").getValue().toString());
                    latlngpass = new LatLng(locLatPass, locLongPass);

                    MarkerOptions passLocMarkerOptions = new MarkerOptions();
                    passLocMarkerOptions.position(latlngpass);
                    passLocMarkerOptions.title(passUsername+ "'s Location");

                    passLocMarkerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE));
                    passLocationMarker = mMap.addMarker(passLocMarkerOptions);
                } else {
                }
            }
            Toast.makeText(MapsActivity.this, "Passenger Username" + passUsername + " latitude" + locLatPass + "Longitude" + locLongPass, Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public void onCancelled(FirebaseError firebaseError) {

    }
});

【问题讨论】:

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


    【解决方案1】:

    这将清除地图上绘制的所有现有标记:

    mMap.clear();
    

    【讨论】:

    • 每个孩子都有一个纬度和经度。所以每次即使只有一个孩子有更新,我的所有标记都会更新你的意思是?
    • 您无法从地图中移除单个标记。您必须删除所有图钉并使用更新的图钉重新绘制所有图钉。
    【解决方案2】:

    您可以通过调用其remove() 方法来移除标记。

    marker.remove();
    

    编辑

    如果每个孩子的值都会改变,你应该考虑使用ChildEventListener

    这是您问题的解决方案,您必须创建一个 HashMap 来保存标记,然后您可以删除或只修改以前的标记。

    Map<String, Marker> markers = new HashMap();
    
    Database.waypoints().addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            passUsername = dataSnapshot.child("name").getValue().toString();
            //getting the passenger's current location
            locLatPass = Double.valueOf(dataSnapshot.child("latitude").getValue().toString());
            locLongPass = Double.valueOf(dataSnapshot.child("longitude").getValue().toString());
            latlngpass = new LatLng(locLatPass, locLongPass);
    
            MarkerOptions passLocMarkerOptions = new MarkerOptions();
            passLocMarkerOptions.position(latlngpass);
            passLocMarkerOptions.title(passUsername+ "'s Location");
    
            passLocMarkerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE));
            Marker marker = mMap.addMarker(passLocMarkerOptions);
            markers.put(dataSnapshot.getKey(), marker);
        }
    
        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            passUsername = dataSnapshot.child("name").getValue().toString();
            //getting the passenger's current location
            locLatPass = Double.valueOf(dataSnapshot.child("latitude").getValue().toString());
            locLongPass = Double.valueOf(dataSnapshot.child("longitude").getValue().toString());
            latlngpass = new LatLng(locLatPass, locLongPass);
    
            MarkerOptions passLocMarkerOptions = new MarkerOptions();
            passLocMarkerOptions.position(latlngpass);
            passLocMarkerOptions.title(passUsername+ "'s Location");
    
            if (markers.contains(dataSnapshot.getKey())) {
                markers.get(dataSnapshot.getKey()).remove();
                // you can also modify the marker instead of removing it and then add it again
            }
            passLocMarkerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE));
            Marker marker = mMap.addMarker(passLocMarkerOptions);
            markers.put(dataSnapshot.getKey(), marker);
        }
    
        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
    
        }
    
        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {
    
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
    
        }
    });
    

    【讨论】:

    • 它仍然不起作用:(它将删除所有标记,只留下一个 passLocationMarker。
    • 你能解释一下为什么你在for (DataSnapshot snapShot : dataSnapshot.getChildren())之后做不必要的循环吗?并请发布数据库结构的JSON
    • @sweetzylpili 你的第二个循环是不必要的,看看我更新的答案
    • 你好@wilik。我在这条线上遇到了麻烦: Database.waypoints().addChildEventListener(new ChildEventListener() { 你对数据库是什么意思是我想要获取的 firebase 数据库吗?这就是我所做的 passRef = new Firebase(Config. FIREBASE_URL_PASSENGER); passRef.waypoints().addChildEventListener(new ChildEventListener() 但是 waypoints() 是一条 readline,上面写着“无法解析方法'waypoints()'”。我是否必须在我的成绩应用程序上添加另一个依赖项?
    • 这只是我的例子,就这样做passRef.addChildEventListener()@sweetzylpili
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 2016-08-07
    相关资源
    最近更新 更多