【问题标题】:Android Firebase remove Google Maps markersAndroid Firebase 删除谷歌地图标记
【发布时间】:2017-02-10 18:48:43
【问题描述】:

尝试制作一个小型 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();


    }

谢谢!

【问题讨论】:

  • 而且你已经验证了,当用户离开时,Uid位置肯定设置为null,对吗?它是否留下了他们的 Uid,但只是将其设置为 null?
  • 感谢 Ryan,当用户离开时,Firebase JSON 中该用户的整个节点都会被删除,因此不会留下该用户的任何痕迹。
  • uAmarker 最初设置在哪里,如果 FireBase 看到该用户,这是否说明了这一点?

标签: android firebase firebase-realtime-database google-maps-markers


【解决方案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) {

    }
});

【讨论】:

  • 您好,威利克,谢谢。我将尝试实现您的代码。非常感谢您的帮助。
  • 威利克,工作就像一个魅力!当我说像魅力时,那是因为我不明白它为什么起作用:) 非常感谢!
  • 不明白的部分请告诉我,我会尽力为你解释的:)
  • 我之前没有使用过“hashmap”。我了解您在标记和用户 ID 之间建立了联系,我将进一步研究哈希图。非常感谢!
  • 你可以阅读更多关于HashMap in this documentation
猜你喜欢
  • 2016-09-24
  • 2016-10-12
  • 2012-10-17
  • 2018-10-13
  • 1970-01-01
  • 2019-03-07
  • 2014-05-01
  • 2016-06-21
  • 1970-01-01
相关资源
最近更新 更多