0

У меня возникли проблемы. Я извлекаю свою широту и долготу в 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) { 

    } 
}); 

ответ

2

Это очистит все существующие маркеры, нанесенные на карту:

mMap.clear(); 
+0

У каждого ребенка есть широта и долгота. поэтому каждый раз, когда есть обновление даже в одном ребенке, все мои маркеры будут обновляться, что вы имеете в виду? –

+0

map.clear() очистить всю полилинию и все маркеры. –

+0

Вы не можете удалить один маркер с карты. Вы должны удалить все контакты и повторно нарисовать все с обновленным. – EEJ

0

Вы можете удалить маркер, вызвав метод remove().

marker.remove(); 

EDIT

Если значение каждого ребенка будет меняться, то следует рассмотреть вопрос об использовании 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) { 

    } 
}); 
+0

он по-прежнему не работает :(он удалит все маркеры, оставив только один passLocationMarker. –

+0

вы можете объяснить, почему вы делаете ненужный цикл после 'for (DataSnapshot snapShot: dataSnapshot.getChildren())?? И, пожалуйста, разместите JSON структура базы данных – Wilik

+0

@sweetzylpili ваш второй цикл не нужен, посмотрите мой обновленный ответ – Wilik

 Смежные вопросы

  • Нет связанных вопросов^_^