Как обновить маркеры на карте при использовании ClusterManager

Я пытаюсь обновление моя карта с новыми данными с сервера, но я не могу понять, как удалить старые элементы (маркеры и кластер-использование ClusterManager) из map (- мне кажется, что я могу добавить только в ClusterManager.

У меня есть BroadcastReceiver, который получает намерение, когда есть новые данные. Я пробовал что-то вроде этого: ( но это дает мне UnsupportedOperationException в соответствии с "...getMarkers ().clear ();"

private BroadcastReceiver myRefrestMapBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "onReceive");
        mClusterManager.clearItems();
        mClusterManager.getMarkerCollection().getMarkers().clear();
        mClusterManager.getClusterMarkerCollection().getMarkers().clear();
        mClusterManager.addItems(LocationGetter.getReports());
    }
};

Я добавил данные по карте только с эта функция.

java.util.Collection<Marker> userCollection = mClusterManager.getMarkerCollection().getMarkers();
            ArrayList<Marker> userList = new ArrayList<Marker>(userCollection);
            // now is userList empty
            for(Marker marker: userList){
                marker.remove();
            }

            java.util.Collection<Marker> userCollection2 = mClusterManager.getClusterMarkerCollection().getMarkers();
            ArrayList<Marker> userList2 = new ArrayList<Marker>(userCollection2);
            // now is userList2 empty
            for(Marker marker: userList2){
                marker.remove();
            }

            mClusterManager.addItems(LocationGetter.getReports());

5 ответов


по данным ClusterManager документация, мы можем использовать mClusterManager.cluster();

этот метод заставляет повторно кластер. Вы можете вызвать это после добавления новый пункт(ы).


Я все время концентрировался на ClusterManager, поэтому я забыл о GoogleMap и, в частности, метод clear(). Я смог решить проблему с помощью этого кода:

mGoogleMap.clear();
mClusterManager.clearItems();  // calling just in case (may not be needed)
mClusterManager.addItems(LocationGetter.getReports());

нет никакого API, чтобы уведомить, что элемент кластера был обновлен. Но вы можете использовать clusterManager.removeItem() + clusterManager.addItem() для принудительного обновления элемента.

но вы должны быть осторожны, так как вы обычно хотите обновить элемент, потому что он изменил некоторые свойства, которые влияют на рендеринг, вам нужно использовать пользовательский ClusterRenderer, что поддерживает это и переопределяет onClusterItemRendered() и/или onClusterRendered(). Использование вариантов onBefore не будет работать, потому что они вызываются только один раз при создании маркера.

вы можете посмотрите на эту проблему GitHub выпуск GitHub


поскольку мое приложение должно обновлять кластеры несколько раз после создания карты, я нашел этот рабочий процесс как лучшее решение для удаления и добавления новых кластеров:

mGoogleMap.clear();
mClusterManager.clear(); 
//Do work to add items to cluster
mClusterManager.addItems(yourItemsList);
//Finally 
mClusterManager.cluster(); 

это должно заставить кластеры перезаписывать после изменения содержимого.


мне было интересно, как у меня могла быть эта проблема - я никогда не сталкивался с такими проблемами с узлами карты.

однако это было в логике настройки или обновления карты моего образца приложения:

        mClusterManager = new ClusterManager<>(getContext(), googleMap);
        mClusterManager.setAnimation(false);
        mClusterManager.clearItems();

я добавлял узлы из БД, затем также некоторые узлы из запроса, было заметное влияние, пока я не добавил нулевую проверку для конструктора

т. е. вот как я должен был это сделать:

    if (mClusterManager == null)
            mClusterManager = new ClusterManager<>(getContext(), googleMap);
        mClusterManager.setAnimation(false);
        mClusterManager.clearItems();

Я, должно быть, скопировал и вставил это и потратил на это полчаса .. Берегись!