Google Maps, добавить новые маркеры и удалить старые маркеры Android - PullRequest
0 голосов
/ 02 октября 2018

в моем приложении я получаю 25 маркеров от веб-сервиса и добавляю их на карту, затем, когда пользователь перемещает карту, я определяю центральное положение и получаю новые 25 маркеров, чтобы добавить их на карту.процесс должен быть следующим: 1 - получить 25 маркеров из веб-сервиса 2 - добавить 25 маркеров на карту 3 - при перемещении карты определить центральное положение 4 - получить новые 25 маркеров 5 - добавить новые 25 маркеров на карту 6 - удалитьстарые 25 маркеров с карты моя проблема в номере 6, как я могу удалить 25 старых маркеров после добавления 25 новых маркеров.Я надеюсь, что я могу найти какие-либо полезные идеи, и спасибо

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Создайте переменную класса 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 и с карты.

0 голосов
/ 07 октября 2018

@ 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, это означает, что маркер нене существует в новом списке и должен быть удален с карты

0 голосов
/ 02 октября 2018

Что вы должны сделать, прежде чем добавлять новые маркеры, вы должны очистить карту, вызвав mGoogleMap.clear ().И вы должны делать это каждый раз перед добавлением новых маркеров.

...