当前位置: 首页 > 知识库问答 >
问题:

Android Firebase删除Google地图标记

安建木
2023-03-14

试图制作一个小的Android应用程序,以谷歌地图标记的形式显示人们的位置。

当用户按下按钮出现在地图上时,应用程序会从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();


    }

谢啦!

共有1个答案

楚弘益
2023-03-14

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

    }
});
 类似资料:
  • 我想删除一个本地图像标记(“存储库”/“标记”组合)。有可能吗? 我如何才能在仅与一个图像ID相关联的多个标记中删除任何一个标记而不删除其他标记?在我的情况下,我只想排除hiworld存储库。我可以删除图像,因此也可以删除与之相关联的所有标签,但这不是我想要做的。下面是输入命令docker images时显示的内容。 提前道谢。

  • 我已经尝试在这里和谷歌地图API留档上查看了大量的代码块,但仍然无法找出如何隐藏标记。 这是我正在使用的当前代码,它在一个实例中有效。有一次,我在带有标记的函数中添加了“for”循环。setMap(null)Firefox显示以下错误: markers.set地图不是一个函数 附加信息:校园地图和完整代码(不包括地图API)

  • 删除地图将删除地图中的图层,相关设置,该操作不可恢复,请慎重操作。删除后该地图的分享链接将自动失效。 注意:删除地图不会影响到你在数据管理中创建的数据。你可以在其他地图中继续使用这些数据。

  • 我已经添加了片段活动地图,并使用addMarker函数添加了几个标记,但我能够删除所有标记,我收到了不同标记列表的通知, 现在我想删除所有标记并添加新标记。 一种将所有标记保留在列表中并逐个删除的方法,(marker.remove()) 有没有更好的方法清除所有标记。

  • 我正在创建一个加载地图 我有一个包含标记信息的对象,它也包含google maps标记对象。我的代码检测是否应根据边界框或缩放级别删除市场。我将marker对象设置为“setMap(null);”使用firebug,我可以看到它被设置了,然后我完全删除了父对象,并且对象数据长度得到了正确更新。 当一个标记被认为删除时,我将其输出到firebug控制台,似乎正在工作,并且我可以看到该标记没有从aja