2016-10-02 81 views
1

試圖製作一個小型Android應用程序,以Google地圖標記的形式顯示人的位置。Android Firebase刪除Google地圖標記

當用戶按下按鈕使其出現在地圖上時,應用程序將從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); 

        } 
       } 
       } 

我進入或離開地圖(按兩家晶圓廠:goActivegoNotActive):代碼

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位置肯定設置爲空,是否正確?它是否留下他們的UID,但只是將其設置爲空? – Ryan

+0

感謝Ryan,當用戶離開時,Firebase JSON中該用戶的整個節點被刪除,因此該用戶的任何痕跡都不會被保留。 –

+0

uAmarker最初設置在哪裏,是FireBase如何看待該用戶? – Ryan

回答

1

改爲使用ChildEventListener,然後將每個標記映射到每個用戶的ID。

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

嗨Wilik,謝謝。我會盡力實現你的代碼。非常感謝你的幫助。 –

+0

Wilik,工作就像一個魅力!當我說像一個魅力,這是因爲我不明白爲什麼它的工作:)非常感謝你! –

+0

請告訴哪個部分你不明白,我會盡力爲你解釋:) – Wilik