Android Firebase 移除 Google 地图标记

Android Firebase remove Google Maps markers

尝试制作一个小型 Android 应用程序,将人员的位置显示为 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);

                    }
                }
                }

我的进出地图密码(按两个FAB: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();


    }

谢谢!

改为使用 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) {

    }
});