google 地图,添加新标记并删除旧标记 android
google maps, add new markers and delete old markers android
在我的应用程序中,我从网络服务中获得了 25 个标记,并将它们添加到地图中,然后当用户移动地图时,我检测到中心位置并获得了新的 25 个标记以将它们添加到地图中。该过程必须是:
1-从网络服务中获取 25 个标记
2-将 25 个标记添加到地图
3-地图移动时,检测中心位置
4-获得新的 25 个标记
5-将新的 25 个标记添加到地图
6-从地图中删除旧的 25 个标记
我的问题是第 6 个问题,如何在添加 25 个新标记后删除 25 个旧标记。
我希望我能找到任何有用的想法,谢谢
您必须做的是,在添加新标记之前,您必须通过调用 mGoogleMap.clear() 清除地图。每次添加新标记之前都必须这样做。
创建一个 HashMap
class 变量来保存有关标记的信息:
HashMap<Long, Marker> markerList = new HashMap<>();
(我假设 bike.getId() returns 是 long
类型,但是如果您使用了不同的类型,则必须更改 HashMap
和以下代码反映该类型。)
在 for (Bikes bike : arrayList)
循环之后 运行 遍历 markerList 中的所有值并删除不在 arrayList 中的 Markers
。
private void addMarkers(){
//set Markers of bikes list
//First loop!!
for (Bikes bike : arrayList){
BitmapDescriptor pinMarker = null;
LatLng latLng = new LatLng(Double.parseDouble(bike.getLatitude()),Double.parseDouble(bike.getLongitude()));
switch (bike.getBreakdown()){
case "false":
pinMarker = pinWork;
break;
case "true":
pinMarker = pinMaintenance;
break;
}
Marker marker = VelosMap.addMarker(new MarkerOptions()
.position(latLng)
.icon(pinMarker)
.zIndex(1));
if(!markerList.containsKey(bike.getId())){
Marker marker = map.addMarker(marker);
//Add the marker to the marker list
markerList.put(bike.getId(), marker);
HashMap<String,String>data=new HashMap<String,String>();
data.put("id",bike.getId());
data.put("imei",bike.getImei());
data.put("inUse",bike.getInUse());
data.put("breakdown",bike.getBreakdown());
marker.setTag(data);
}
}
// This will iterate through all the items in the new list ...
//...and remove the markers that are not found in the new list
// Second Loop!!
Iterator<Long> it = markerList.keySet().iterator();
while(it.hasNext();){
Long key = it.next();
if(!bikeContains(key)){
Marker marker = markerList.remove(key);
marker.remove();
}
}
}
private boolean bikeContains(Long id){
for (Bikes bike : arrayList){
Long bikeId = bike.getId();
if(bikeId == id){
return true;
}
}
return false;
}
解释:
第一次通过addMarkers()
:
markerList
是空的,因此在第 if(!markerList.containsKey(bike.getId())){
行中,每次通过第一个循环 for (Bikes bike : arrayList){
都会添加一个新条目。 Marker
将被添加到地图中。在第二个循环 for (Long key : markerList.keySet()){
中,我们遍历 HashMap
,如果 arrayList
不包含 "key",则将其从 markerList
和地图中删除.但是,因为这是第一次通过,所以不会删除任何内容。
第二次通过 addMarkers()
方法,arrayList
中出现了不同的自行车位置,其中包含 Bike
数据,其中 "id" 值的自行车应该与第一次——至少对一些自行车来说是这样。
这次调用 if(!markerList.containsKey(bike.getId())){
时,bike.getId()
的某些值仍将在 markerList
中 --> 什么也没做!但是,某些 bike.getId()
值不会出现在列表中 --> 这些值将添加到列表中,而标记将添加到地图中。这意味着您将在 markerList
.
中拥有超过 25 个标记和超过 25 个元素
在第二个循环 for (Long key : markerList.keySet()){
中执行检查以查看 arrayList
是否包含来自 markerList
的密钥。如果不在 arrayList
中,则该标记将从 markerList
和地图中移除。
@Barns 谢谢你的帮助,那个循环不起作用,我得到这个错误 java.util.HashMap$HashIterator.nextEntry,所以我用这个循环改变它,最后它起作用了
for (Iterator<Map.Entry<String, Marker>> iterator = markerList.entrySet().iterator(); iterator.hasNext();){
Map.Entry<String, Marker> entry = iterator.next();
//Log.e("key", entry.getKey()+"");
String bikeId = entry.getKey();
int i = SearchBike(bikeId);
//Log.e("i",i+"");
if (i == 0) {
Marker marker = entry.getValue();
marker.remove();
iterator.remove();
markerList.remove(bikeId);
}
}
对于 SearchBike(bikeId) 我创建它是因为我不能使用 arrayList.contain() 因为结果是一个对象而不是字符串
private int SearchBike(String id){
int i = 0;
for (Bikes bike : arrayList){
if (bike.getId().equals(id)) {
i++;
}
}
return i;
}
所以如果 i==0 这意味着标记不存在于新列表中并且应该从地图中删除
在我的应用程序中,我从网络服务中获得了 25 个标记,并将它们添加到地图中,然后当用户移动地图时,我检测到中心位置并获得了新的 25 个标记以将它们添加到地图中。该过程必须是: 1-从网络服务中获取 25 个标记 2-将 25 个标记添加到地图 3-地图移动时,检测中心位置 4-获得新的 25 个标记 5-将新的 25 个标记添加到地图 6-从地图中删除旧的 25 个标记 我的问题是第 6 个问题,如何在添加 25 个新标记后删除 25 个旧标记。 我希望我能找到任何有用的想法,谢谢
您必须做的是,在添加新标记之前,您必须通过调用 mGoogleMap.clear() 清除地图。每次添加新标记之前都必须这样做。
创建一个 HashMap
class 变量来保存有关标记的信息:
HashMap<Long, Marker> markerList = new HashMap<>();
(我假设 bike.getId() returns 是 long
类型,但是如果您使用了不同的类型,则必须更改 HashMap
和以下代码反映该类型。)
在 for (Bikes bike : arrayList)
循环之后 运行 遍历 markerList 中的所有值并删除不在 arrayList 中的 Markers
。
private void addMarkers(){
//set Markers of bikes list
//First loop!!
for (Bikes bike : arrayList){
BitmapDescriptor pinMarker = null;
LatLng latLng = new LatLng(Double.parseDouble(bike.getLatitude()),Double.parseDouble(bike.getLongitude()));
switch (bike.getBreakdown()){
case "false":
pinMarker = pinWork;
break;
case "true":
pinMarker = pinMaintenance;
break;
}
Marker marker = VelosMap.addMarker(new MarkerOptions()
.position(latLng)
.icon(pinMarker)
.zIndex(1));
if(!markerList.containsKey(bike.getId())){
Marker marker = map.addMarker(marker);
//Add the marker to the marker list
markerList.put(bike.getId(), marker);
HashMap<String,String>data=new HashMap<String,String>();
data.put("id",bike.getId());
data.put("imei",bike.getImei());
data.put("inUse",bike.getInUse());
data.put("breakdown",bike.getBreakdown());
marker.setTag(data);
}
}
// This will iterate through all the items in the new list ...
//...and remove the markers that are not found in the new list
// Second Loop!!
Iterator<Long> it = markerList.keySet().iterator();
while(it.hasNext();){
Long key = it.next();
if(!bikeContains(key)){
Marker marker = markerList.remove(key);
marker.remove();
}
}
}
private boolean bikeContains(Long id){
for (Bikes bike : arrayList){
Long bikeId = bike.getId();
if(bikeId == id){
return true;
}
}
return false;
}
解释:
第一次通过addMarkers()
:
markerList
是空的,因此在第 if(!markerList.containsKey(bike.getId())){
行中,每次通过第一个循环 for (Bikes bike : arrayList){
都会添加一个新条目。 Marker
将被添加到地图中。在第二个循环 for (Long key : markerList.keySet()){
中,我们遍历 HashMap
,如果 arrayList
不包含 "key",则将其从 markerList
和地图中删除.但是,因为这是第一次通过,所以不会删除任何内容。
第二次通过 addMarkers()
方法,arrayList
中出现了不同的自行车位置,其中包含 Bike
数据,其中 "id" 值的自行车应该与第一次——至少对一些自行车来说是这样。
这次调用 if(!markerList.containsKey(bike.getId())){
时,bike.getId()
的某些值仍将在 markerList
中 --> 什么也没做!但是,某些 bike.getId()
值不会出现在列表中 --> 这些值将添加到列表中,而标记将添加到地图中。这意味着您将在 markerList
.
在第二个循环 for (Long key : markerList.keySet()){
中执行检查以查看 arrayList
是否包含来自 markerList
的密钥。如果不在 arrayList
中,则该标记将从 markerList
和地图中移除。
@Barns 谢谢你的帮助,那个循环不起作用,我得到这个错误 java.util.HashMap$HashIterator.nextEntry,所以我用这个循环改变它,最后它起作用了
for (Iterator<Map.Entry<String, Marker>> iterator = markerList.entrySet().iterator(); iterator.hasNext();){
Map.Entry<String, Marker> entry = iterator.next();
//Log.e("key", entry.getKey()+"");
String bikeId = entry.getKey();
int i = SearchBike(bikeId);
//Log.e("i",i+"");
if (i == 0) {
Marker marker = entry.getValue();
marker.remove();
iterator.remove();
markerList.remove(bikeId);
}
}
对于 SearchBike(bikeId) 我创建它是因为我不能使用 arrayList.contain() 因为结果是一个对象而不是字符串
private int SearchBike(String id){
int i = 0;
for (Bikes bike : arrayList){
if (bike.getId().equals(id)) {
i++;
}
}
return i;
}
所以如果 i==0 这意味着标记不存在于新列表中并且应该从地图中删除