Android Firebase 移除 Google 地图标记
Android Firebase remove Google Maps markers
尝试制作一个小型 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: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();
}
谢谢!
改为使用 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) {
}
});
尝试制作一个小型 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: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();
}
谢谢!
改为使用 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) {
}
});