Android Firebase删除Google地图标记 [英] Android Firebase remove Google Maps markers

查看:179
本文介绍了Android Firebase删除Google地图标记的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

尝试制作一个小型的Android应用程序,将用户的位置显示为Google地图标记。



当用户按下按钮以显示在地图上时,应用程序从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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆