2016-10-02 2 views
1

Попытка сделать небольшое приложение для Android, в котором отображаются местоположения людей в качестве маркеров Google Maps.Android Firebase удаляет маркеры Google Maps

Когда пользователь нажимает кнопку для отображения на карте, приложение извлекает данные пользователей из Firebase JSON и отображает пользователей на карте в режиме реального времени. Если пользователь перемещается, маркер перемещается вместе с ним (удаляется и воссоздается при изменении его местоположения).

Все работает отлично, за исключением того, что, когда пользователь нажимает, чтобы оставить карту, его маркер остается на всех других телефонах, даже если он удален из Firebase JSON.

Может ли кто-нибудь объяснить, как исправить эту проблему? Мой код для извлечения пользователей и создавать маркеры на карте:

ValueEventListener UsersActiveListener = new ValueEventListener() { 

      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { 

        UsersActive uA = userSnapshot.getValue(UsersActive.class); 

        if (uA.getUserIDcode() != firebaseauth.getCurrentUser().getUid()) { 

         Double uAlatindouble = Double.valueOf(uA.getUserlat()); 
         Double uAlonindouble = Double.valueOf(uA.getUserlon()); 

         LatLng uALTLG; 

         if (uAmarker != null) { 
          uAmarker.remove(); 
         } 

         uALTLG = new LatLng(uAlatindouble, uAlonindouble); 
         MarkerOptions markerOptions = new MarkerOptions(); 
         markerOptions.position(uALTLG); 
         markerOptions.title(uA.getUsername()); 
         markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.usermarker)); 
         uAmarker = mMap.addMarker(markerOptions); 

        } 
       } 
       } 

Мой код для входа или выхода из карты (нажав две системы FABS: goActive, goNotActive):

public void goActiveFAB (View view){ 

     isActive = true; 
     FABgoActive.setVisibility(GONE); 
     FABDontgoActive.setVisibility(View.VISIBLE); 

     // user in map class 

     UsersActive CurrentUserActive = new UsersActive(); 

     CurrentUserActive.setUserIDcode(firebaseauth.getCurrentUser().getUid()); 
     CurrentUserActive.setUserlat(String.valueOf(mLastLocation.getLatitude())); 
     CurrentUserActive.setUserlon(String.valueOf(mLastLocation.getLongitude())); 
     CurrentUserActive.setUsername(currentUser.getNickname()); 

     groupPosShareRef.child(firebaseauth.getCurrentUser().getUid()).setValue(CurrentUserActive); 

    } 

    public void goNotActiveFAB (View view){ 

     isActive = false; 
     FABgoActive.setVisibility(View.VISIBLE); 
     FABDontgoActive.setVisibility(View.GONE); 

     groupPosShareRef.child(firebaseauth.getCurrentUser().getUid()).removeValue(); 


    } 

Спасибо!

+0

И вы подтвердили, что, когда пользователь уйдет, местоположение UID определенно установлено равным null, правильно? Оставляет ли он их Uid, а просто устанавливает его в null? – Ryan

+0

благодарит Райана, когда пользователь уходит, весь узел этого пользователя в Firebase JSON удаляется, поэтому никаких следов этого пользователя не остается. –

+0

Где первоначально установлен uAmarker и что говорит, что FireBase видит этого пользователя или нет? – Ryan

ответ

1

Вместо этого используйте ChildEventListener, а затем сопоставьте каждый маркер с идентификатором каждого пользователя.

Map<String, Marker> markers = new HashMap(); 

ref.addChildEventListener(new ChildEventListener() { 
    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
     UsersActive uA = dataSnapshot.getValue(UsersActive.class); 

     // ... 

     Marker uAmarker = mMap.addMarker(markerOptions); 
     markers.put(dataSnapshot.getKey(), uAmarker); 
    } 

    @Override 
    public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
     UsersActive uA = dataSnapshot.getValue(UsersActive.class); 

     // ... 

     if (markers.contains(dataSnapshot.getKey())) { 
      Marker marker = markers.get(dataSnapshot.getKey()); 

      marker.remove(); 
      // or 
      // marker.setPosition(newPosition); 
     } 

     Marker uAmarker = mMap.addMarker(markerOptions); 
     markers.put(dataSnapshot.getKey(), uAmarker); 
    } 

    @Override 
    public void onChildRemoved(DataSnapshot dataSnapshot) { 
     if (markers.contains(dataSnapshot.getKey())) { 
      Marker marker = markers.get(dataSnapshot.getKey()); 
      marker.remove(); 
     } 
    } 

    @Override 
    public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 
+0

Привет, Вилик, спасибо. Я попытаюсь реализовать свой код. действительно ценю вашу помощь. –

+0

Вилик, работал как шарм! и когда я говорю как шарм, это потому, что я не понимаю, почему это сработало :) Большое вам спасибо! –

+0

Пожалуйста, сообщите, какую часть вы не понимаете, я попытаюсь объяснить это вам :) – Wilik