Remove the previous markers as the location updates

社会主义新天地 提交于 2020-01-06 21:07:21

问题


I have placed some markers on map. As the location of the marker changes it places another marker on the map but keeping the last marker as it is which creates multiple markers of the same id on the map.

I there any way to clear the previous marker as the location updates.

I am retrieving location changes from firebase database in any array.

Here is my code:

import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.telephony.SmsManager;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.Map;

public class MapsActivity extends MainActivity implements    OnMapReadyCallback {
// flag for Internet connection status
Boolean isInternetPresent = false;

// Connection detector class
ConnectionDetector cd;

// Alert Dialog Manager
AlertDialogManager alert = new AlertDialogManager();

// GPS Location
GPSTracker gps;

Handler handler = new Handler();
Runnable refresh;


final int[] count = {0};

final ArrayList<String> locationData = new ArrayList<>();
final ArrayList<String> DriverInfo = new ArrayList<>();

public GoogleMap mMap;
public Marker marker;

MediaPlayer mediaPlayer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(MenuItem item) {
            int id = item.getItemId();

            if (id == R.id.profile) {
                finish();
                startActivity(new Intent(MapsActivity.this, ProfileActivity.class));
            } else if (id == R.id.nearby) {
                finish();
                startActivity(new Intent(MapsActivity.this, NearbyActivity.class));
            } else if (id == R.id.notification) {
                finish();
                startActivity(new Intent(MapsActivity.this, NotificationActivity.class));
            } else if (id == R.id.setting) {
                finish();
                startActivity(new Intent(MapsActivity.this, SettingsActivity.class));
            } else if (id == R.id.faq) {
                finish();
                startActivity(new Intent(MapsActivity.this, FaqActivity.class));
            } else if (id == R.id.emergecy_contact) {
                finish();
                startActivity(new Intent(MapsActivity.this, EmergencyContactActivity.class));
            } else if (id == R.id.support) {
                finish();
                startActivity(new Intent(MapsActivity.this, SupportActivity.class));
            } else if (id == R.id.help) {
                finish();
                startActivity(new Intent(MapsActivity.this, HelpActivity.class));
            } else if (id == R.id.about_us) {
                finish();
                startActivity(new Intent(MapsActivity.this, AboutUsActivity.class));
            } else if (id == R.id.rate) {
                finish();
                startActivity(new Intent(MapsActivity.this, RateUsActivity.class));
            } else if (id == R.id.share) {
                finish();
                startActivity(new Intent(MapsActivity.this, ShareActivity.class));
            }

            DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
            drawer.closeDrawer(GravityCompat.START);
            return true;
        }
    });

    mediaPlayer = MediaPlayer.create(this, R.raw.demonstrative);

    cd = new ConnectionDetector(getApplicationContext());

    // Check if Internet present
    isInternetPresent = cd.isConnectingToInternet();
    if (!isInternetPresent) {
        // Internet Connection is not present
        alert.showAlertDialog(MapsActivity.this, "Internet Connection Error",
                "Please connect to working Internet connection", false);
        // stop executing code by return
        return;
    }

    // creating GPS Class object
    gps = new GPSTracker(this);

    // check if GPS location can get
    if (gps.canGetLocation()) {
        Log.d("Your Location", "latitude:" + gps.getLatitude() + ", longitude: " + gps.getLongitude());
    } else {
        // Can't get user's current location
        alert.showAlertDialog(MapsActivity.this, "GPS Status",
                "Couldn't get location information. Please enable GPS",
                false);
        // stop executing code by return
        return;
    }
    // Obtain the SupportMapFragment and get notified when the map is ready to be used.
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);


    //Retrive data from firebase

    final FirebaseDatabase database = FirebaseDatabase.getInstance();
    final DatabaseReference myRef = database.getReference().child("users");


    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            collectLocation((Map<String, Object>) dataSnapshot.getValue());
            collectdriverInfo((Map<String, Object>) dataSnapshot.getValue());
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }

    });
}


//Retrieve location from database
public void collectLocation(Map<String, Object> users) {
    for (Map.Entry<String, Object> entry : users.entrySet()) {
        //Get user map
        Map singleUser = (Map) entry.getValue();
        //Get phone field and append to list
        locationData.add((String) singleUser.get("location"));

        count[0]++;

    }

    System.out.println("Location: " + locationData.toString());
    System.out.println("My count is: " + count[0]);
}

//Retrive driver info from database
public void collectdriverInfo(Map<String, Object> users) {
    final String[] userName = new String[count[0]];
    final String[] userContact = new String[count[0]];

    final double[] latitude = new double[count[0]];
    final double[] longitude = new double[count[0]];


    for (Map.Entry<String, Object> entry : users.entrySet()) {
        //Get user map
        Map singleUser = (Map) entry.getValue();
        //Get phone field and append to list
        DriverInfo.add((String) singleUser.get("driverInfo"));
    }
    System.out.println("Driver Information: " + DriverInfo.toString());


    //Convert location string to double
    int j = 0;
    for (String loc : locationData) {
        System.out.println("LocationMMdm" + loc);
        String[] Location = loc.split(",");
        latitude[j] = Double.parseDouble(Location[0]);
        longitude[j] = Double.parseDouble(Location[1]);
        System.out.println("lat: " + latitude[0] + " " + "log: " + longitude[0]);

        j++;
    }

    //Split driver info and add marker on map
    int i = 0;
    for (String data : DriverInfo) {
        System.out.println("datainfo " + data);
        String[] singleEntry = data.split(",");
        userName[i] = singleEntry[0];
        userContact[i] = singleEntry[1];

        mMap.addMarker(new MarkerOptions().position(new LatLng(latitude[i], longitude[i])).
                    title(userName[i]).
                    snippet(userContact[i]).
                    flat(true).
                    alpha(0.9f).
                    anchor(0.5f, 0.5f).
                    rotation((0.0f)).
                    icon(BitmapDescriptorFactory.fromResource(R.drawable.markeramb)));
            i++;
    }


    mMap.setOnInfoWindowLongClickListener(new GoogleMap.OnInfoWindowLongClickListener() {
        @Override
        public void onInfoWindowLongClick(Marker marker) {
            String phoneno = marker.getSnippet();
            double myLat = gps.getLatitude();
            double myLog = gps.getLongitude();
            String title = marker.getTitle();
            String msg = myLat + ", " + myLog;

            try {
                SmsManager smsManager = SmsManager.getDefault();
                smsManager.sendTextMessage(phoneno, null, msg, null, null);

                View view = findViewById(android.R.id.content);
                Snackbar.make(view, "Message Sent", Snackbar.LENGTH_LONG).show();

                mediaPlayer.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    //Call to the ambulance driver
    mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
        @Override
        public void onInfoWindowClick(Marker marker) {
            try {
                String uri = "tel:" + marker.getSnippet();
                if (marker.getSnippet() == null) {
                    alert.showAlertDialog(MapsActivity.this, "Not Present",
                            "Contact no. not available", false);
                } else {
                    finish();
                    Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse(uri));
                    startActivity(callIntent);
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    });
    System.out.println("Users name are: " + userName.toString());
    System.out.println("Users count is: " + userContact.toString());
    System.out.println("Count is:" + count[0]);
}



@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    mMap.setMyLocationEnabled(true);
    double myLatitude = gps.getLatitude();
    double myLongitude = gps.getLongitude();
    LatLng latLng = new LatLng(myLatitude, myLongitude);
    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 10));
}


@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
        finish();
        startActivity(new Intent(MapsActivity.this, MainActivity.class));
    }
  }
}

回答1:


The below may help you to remove marker

if (destnationMarker != null) {

   destnationMarker.remove();
   mMap.clear();
   destnationMarker = null;

}


来源:https://stackoverflow.com/questions/41857313/remove-the-previous-markers-as-the-location-updates

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!