创建一个HashMap 类变量来保存有关标记的信息:
HashMap<Long, Marker> markerList = new HashMap<>();
(我假设bike.getId() 返回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 不包含“键”,那么它将从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 和地图中删除。