Создайте переменную класса HashMap
для хранения информации о маркерах:
HashMap<Long, Marker> markerList = new HashMap<>();
(я полагаю, что bike.getId () возвращает тип long
, но если вы использовали другой тип, вынеобходимо изменить определение HashMap
и следующий код, чтобы отразить этот тип.)
После запуска цикла for (Bikes bike : arrayList)
просмотрите все значения в markerList и удалите Markers
, которые не отображаются.t в массиве List.
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()
не будут в списке -> они будут добавлены в список, а маркеры добавлены на карту.Это означает, что у вас будет более 25 маркеров и более 25 элементов в markerList
.
Во втором цикле for (Long key : markerList.keySet()){
выполняется проверка, чтобы увидеть, содержит ли arrayList
ключи от markerList
.Если не в arrayList
, то этот маркер удаляется с markerList
и с карты.