0

Ich habe ein Problem. Ich erhalte meine Breiten- und Längengrade in Echtzeit-Firebase und erstelle einen Marker, aber jedes Mal, wenn der Längen- und Breitengrad aktualisiert wird, wird ein weiterer Marker erstellt.Vorherige Markierung entfernen

Wie kann ich den vorherigen Marker löschen? Hier ist mein Code:

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) { 

    } 
}); 

Antwort

2

Dies wird deaktivieren Sie alle vorhandenen Markierungen auf der Karte gezeichnet:

mMap.clear(); 
+0

In jedem Kind gibt es eine Breite und Länge. also jedes Mal, wenn es ein Update gibt, sogar in nur einem Kind, werden alle meine Marker aktualisiert du meinst? –

+0

map.clear() Lösche alle Polylinien und alle Marker. –

+0

Sie können keinen einzelnen Marker aus der Karte entfernen. Sie müssen alle Pins entfernen und alle mit den aktualisierten Eins neu zeichnen. – EEJ

0

Sie können die Markierung entfernen, indem seine remove() Methode aufrufen.

marker.remove(); 

EDIT

Wenn der Wert jedes Kind, werden geändert werden Sie in Betracht ziehen sollten ChildEventListener

Hier ist die Lösung für Ihr Problem besteht darin, Sie haben eine HashMap erstellen, um die Markierungen zu speichern und Dann können Sie den vorherigen Marker entfernen oder einfach ändern.

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) { 

    } 
}); 
+0

es funktioniert immer noch nicht :(Es werden alle Marker entfernt, so dass nur ein passLocationMarker übrig bleibt. –

+0

Können Sie erklären, warum Sie nach 'for (DataSnapshot snapShot: dataSnapshot.getChildren())' unnötige Schleife machen '' und bitte den JSON von die Datenbankstruktur – Wilik

+0

@sweetzylpili Ihre zweite Schleife ist unnötig, sehen Sie sich meine aktualisierte Antwort – Wilik

Verwandte Themen