问题
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