Android 移动标记时,Google Maps会显示两个标记

Android 移动标记时,Google Maps会显示两个标记,android,firebase,google-maps,firebase-realtime-database,google-maps-markers,Android,Firebase,Google Maps,Firebase Realtime Database,Google Maps Markers,我使用谷歌地图Android SDK在地图中填充标记,这些标记的位置存储在我的应用程序的所有用户通用的Firebase数据库中。每个标记的数据存储在唯一的Firebase记录中,每个记录包含标记的纬度和经度以及一个布尔值,该值指示位置是否已验证。 标记最初通过childAdded侦听器添加到地图。然后,应用程序“侦听”Firebase数据库中的以下事件: 添加了一个新标记 更改现有标记(移动到新位置和/或“已验证”) 删除现有标记 我已经实现了一个哈希映射,如中所示 添加标记时,条目将添加到

我使用谷歌地图Android SDK在地图中填充标记,这些标记的位置存储在我的应用程序的所有用户通用的Firebase数据库中。每个标记的数据存储在唯一的Firebase记录中,每个记录包含标记的纬度和经度以及一个布尔值,该值指示位置是否已验证。
标记最初通过childAdded侦听器添加到地图。然后,应用程序“侦听”Firebase数据库中的以下事件:

  • 添加了一个新标记
  • 更改现有标记(移动到新位置和/或“已验证”)
  • 删除现有标记
我已经实现了一个哈希映射,如中所示

添加标记时,条目将添加到哈希映射,其中Firebase pushID(键)用作哈希映射中标记对象的索引(请参阅下面的代码)

privatemapmarkermap=newhashmap();
DatabaseReference dbRef=FirebaseDatabase.getInstance().getReference(); DatabaseReference markerRef=dbRef.child(“标记”); //应用程序启动时加载所有标记 //添加的子项返回所有标记,然后侦听新添加的项 //Log.i(标签,“数据库引用:”+dbRef); //列表选项=新的ArrayList(); markerRef.addChildEventListener(新的ChildEventListener(){ @凌驾 公共void onChildaded(@NonNull DataSnapshot DataSnapshot,@null字符串s){ 试一试{ markerKey=dataSnapshot.getKey(); Log.i(标记“添加标记:”); Log.i(标签,“标记键:+markerKey”); double x=(double)dataSnapshot.child(“x”).getValue(); double y=(double)dataSnapshot.child(“y”).getValue(); boolean v=(boolean)dataSnapshot.child(“v”).getValue(); Log.i(标记,“标记数据-x:+x+”y:+y+”v:+v); 如果(v==true){ Marker Marker=mMap.addMarker(新标记选项() .位置(新板条(y,x)) .icon(BitmapDescriptorFactory.fromResource(R.drawable.verified)); marker.setTag(markerKey); mMarkerMap.put(markerKey,marker); }否则{ Marker Marker=mMap.addMarker(新标记选项() .位置(新板条(y,x)) .icon(BitmapDescriptorFactory.fromResource(R.drawable.unverified)); marker.setTag(markerKey); mMarkerMap.put(markerKey,marker); } }捕获(错误){ noFirebaseAccessAlert(); } } @凌驾 public void onChildChanged(@NonNull DataSnapshot DataSnapshot,@null字符串s){ 试一试{ markerKey=dataSnapshot.getKey(); Log.i(标记“更改标记:”); Log.i(标签,“标记键:+markerKey”); double x=(double)dataSnapshot.child(“x”).getValue(); double y=(double)dataSnapshot.child(“y”).getValue(); boolean v=(boolean)dataSnapshot.child(“v”).getValue(); Log.i(标记,“标记数据-x:+x+”y:+y+”v:+v); Marker changedMarker=mmarkmap.get(markerKey); 如果(v==true){ 更改标记器设置位置(新板条(y,x)); changedMarker.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.verified)); }否则{ 更改标记器设置位置(新板条(y,x)); changedMarker.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.unverified)); } }捕获(错误){ noFirebaseAccessAlert(); } } @凌驾 公共void onChildRemoved(@NonNull DataSnapshot DataSnapshot){ 试一试{ markerKey=dataSnapshot.getKey(); Log.i(标记“删除标记:”); Log.i(标签,“标记键:+markerKey”); Marker deletedMarker=mmarkmap.get(markerKey); deletedMarker.remove(); mmarkMap.移除(标记键); }捕获(错误){ noFirebaseAccessAlert(); } } 问题是,在Firebase中更改数据并调用“childChanged”侦听器时,会在地图上的更新位置放置一个新图标,但原始图标仍保留。 哈希表中没有新的条目

如果我点击任一图标,“onClickMarker”函数将接收相同的标记标识符。 我可以简单地删除现有的标记并添加一个新的标记,但如果可能的话,我宁愿移动现有的标记


这是一个已知的问题吗?

在您的代码中,问题就在这里

Marker marker = mMap.addMarker ( new MarkerOptions ()
                                .position ( new LatLng ( y, x ) )
                                .icon ( BitmapDescriptorFactory.fromResource ( R.drawable.verified ) ) );
每次创建一个新的标记对象,无需每次创建一个新的标记对象,只需在创建一次对象后设置标记位置即可

Marker marker;

            if (mMap != null) {
                if (marker == null) {
                    MarkerOptions options = new MarkerOptions().position(mLatlng)
                            .title(mCity);
                    marker = mMap.addMarker(options);
                } else {
                    marker.setPosition(mLatlng);
                }
                mMap.moveCamera(CameraUpdateFactory.newLatLng(mLatlng));
                mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(mLatlng, 15f));
            }

在你的代码问题是在这里

Marker marker = mMap.addMarker ( new MarkerOptions ()
                                .position ( new LatLng ( y, x ) )
                                .icon ( BitmapDescriptorFactory.fromResource ( R.drawable.verified ) ) );
每次创建一个新的标记对象,无需每次创建一个新的标记对象,只需在创建一次对象后设置标记位置即可

Marker marker;

            if (mMap != null) {
                if (marker == null) {
                    MarkerOptions options = new MarkerOptions().position(mLatlng)
                            .title(mCity);
                    marker = mMap.addMarker(options);
                } else {
                    marker.setPosition(mLatlng);
                }
                mMap.moveCamera(CameraUpdateFactory.newLatLng(mLatlng));
                mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(mLatlng, 15f));
            }

发现了问题。不是谷歌地图问题。另一个例程调用上述代码两次,从而在彼此上方添加了两个标记。当我移动一个标记时,另一个标记保留了下来。上述代码工作正常。更新