2016-10-02 90 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