Android 移动标记时,Google Maps会显示两个标记
我使用谷歌地图Android SDK在地图中填充标记,这些标记的位置存储在我的应用程序的所有用户通用的Firebase数据库中。每个标记的数据存储在唯一的Firebase记录中,每个记录包含标记的纬度和经度以及一个布尔值,该值指示位置是否已验证。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数据库中的以下事件: 添加了一个新标记 更改现有标记(移动到新位置和/或“已验证”) 删除现有标记 我已经实现了一个哈希映射,如中所示 添加标记时,条目将添加到
标记最初通过childAdded侦听器添加到地图。然后,应用程序“侦听”Firebase数据库中的以下事件:
- 添加了一个新标记
- 更改现有标记(移动到新位置和/或“已验证”)
- 删除现有标记
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));
}
发现了问题。不是谷歌地图问题。另一个例程调用上述代码两次,从而在彼此上方添加了两个标记。当我移动一个标记时,另一个标记保留了下来。上述代码工作正常。更新