Android Firebase删除Google地图标记 [英] Android Firebase remove Google Maps markers
问题描述
当用户按下按钮以显示在地图上时,应用程序从Firebase JSON中检索用户数据,并实时显示地图上的用户。如果用户移动,标记随着他移动(当他的位置改变时移除并重新创建)。
除了当用户按下离开地图时,他的标记仍然在所有其他手机,即使它从Firebase JSON删除。
任何人都可以解释如何解决这个问题?我的代码用于检索用户并在地图中创建标记:
pre $ value $ value $ valueEventListener UsersActiveListener = new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot){
for(DataSnapshot userSnapshot:dataSnapshot.getChildren()){
UserActive uA = userSnapshot.getValue(UsersActive。类); $($)
$ b 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 =新的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);
$ b $ / code $ / pre
$ b
我的代码进入或离开地图(按两个FAB: goActive
, goNotActive
):
public void goActiveFAB(View view){
isActive = true;
FABgoActive.setVisibility(GONE);
FABDontgoActive.setVisibility(View.VISIBLE);
//地图类中的用户
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);
$ b $ public void goNotActiveFAB(View view){
isActive = false;
FABgoActive.setVisibility(View.VISIBLE);
FABDontgoActive.setVisibility(View.GONE);
groupPosShareRef.child(firebaseauth.getCurrentUser()。getUid())。removeValue();
谢谢!
解决方案使用 ChildEventListener
,然后将每个标记映射到每个用户的标识。 b
$ b 地图< String,Marker> markers = new HashMap();
ref.addChildEventListener(new ChildEventListener(){
@Override
public void onChildAdded(DataSnapshot dataSnapshot,String s){
UserActive uA = dataSnapshot.getValue(UsersActive .class);
// ...
标记uAmarker = mMap.addMarker(markerOptions);
markers.put(dataSnapshot.getKey(),uAmarker );
$ b @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();
//或
// marker.setPosition(newPosition);
}
标记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();
$ b @Override
public void onChildMoved(DataSnapshot dataSnapshot,String s){
}
@Override
public void onCancelled(DatabaseError databaseError){
$ b}
});
Trying to make a small Android app that shows the locations of people as Google Maps markers.
when the user presses a button to appear on the map, the app retrieves the users data from the Firebase JSON and shows the users on the map in real time. If a user moves, the marker moves with him (removed and recreated when his location changes).
Everything works great, except that when the user presses to leave the map, his marker remains in all the other phones even though it's deleted from the Firebase JSON.
Can anyone explain how to fix this problem? My code for retrieving the users and create markers in the map:
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);
}
}
}
My code for entering or leaving the map (by pressing two FABs: goActive
, goNotActive
):
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();
}
Thanks!
解决方案 Use ChildEventListener
instead, then map each marker to each user's 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) {
}
});
这篇关于Android Firebase删除Google地图标记的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文