Intereting Posts
Должен быть одним из: View.VISIBLE, View.INVISIBLE, View.GONE './gradlew -Dtest.single = тест SimpleTest' запускает все тесты, которые у меня есть Лучший способ изменить версии репозитория Android эффективно после загрузки с помощью repo / git Как выглядит Android StackView? Простой вид калибра, такой как speedmeter in android? Функция записи теста Espresso в Android Studio 2.2 Кнопка setText с Spannable не работает для Android 5.0 Lollipop Как получить правильные границы представления после преобразования Матрица Android SDK и AVD Manager -Cant создать AVD в правильном месте файла Это правильный способ обнаружить прикосновение к прямоугольнику в LibGdx? Кажется, не работает для меня Как отключить даты до сегодняшнего дня в DatePickerDialog Android? Как отладить подписанное приложение Android от Eclipse? Как добавить динамический переключатель в соответствии с заданным количеством отсчетов? Загрузка нескольких изображений с помощью волейбола? Инструмент разработчика для разработки базы данных SQLite для Android

Проблема с удалением элемента из кластера

В моем приложении для Android я должен удалить и повторно добавить элемент кластера в свой GoogleMap, который представляет мое текущее местоположение. Но когда я запускаю этот код:

clusterMng.remove(myitem); 

Я получаю это исключение:

 java.lang.UnsupportedOperationException: NonHierarchicalDistanceBasedAlgorithm.remove not implemented. 

Может кто-нибудь объяснить мне, что это значит? Должен ли я переписать некоторые методы ClusterManager.java во внешней библиотеке? Или я могу просто изменить свой алгоритм?

Solutions Collecting From Web of "Проблема с удалением элемента из кластера"

По умолчанию ClusterManager использует NonHierarchicalDistanceBasedAlgorithm , который не реализует удаление элементов.

Попробуйте вместо этого использовать GridBasedAlgorithm (он поддерживает удаление элементов):

 clusterMng.setAlgorithm(new GridBasedAlgorithm<MyClusterItem>()); 

Или, для лучшей производительности, оберните его с помощью PreCachingAlgorithmDecorator , как это делает ClusterManager по умолчанию:

 clusterMng.setAlgorithm(new PreCachingAlgorithmDecorator<MyClusterItem>(new GridBasedAlgorithm<MyClusterItem>())); 

Вот как я это сделал:

 @Override public void removeItem(T item) { final QuadItem<T> quadItem = new QuadItem<T>(item); synchronized (mQuadTree) { mItems.remove(quadItem); mQuadTree.remove(quadItem); } } 

Я также реализовал equals() и hashCode() в QuadItem как это рекомендуется в TODO исходного кода NonHierarchicalDistanceBasedAlgorithm :

 @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof QuadItem)) { return false; } QuadItem quadItem = (QuadItem) o; return mClusterItem.equals(quadItem.mClusterItem); } @Override public int hashCode() { return mClusterItem.hashCode(); } 

Наконец, я ClusterItem equals() и hashCode() в моем ClusterItem классе ClusterItem .

Как сказал @SergePopulov, NonHierarchicalDistanceBasedAlgorithm не реализует удаление элементов. Для тех, кто не хочет использовать GridBasedAlgoritm, но все же необходимо удалить отдельные элементы из NonHierarchicalDistanceBasedAlgorithm, есть еще одно решение.

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

То, что я сделал, это просто сохранить старые элементы кластера, очистить кластерManager и снова добавить старые элементы, но не добавлять тот, который передается с помощью метода.

Сначала создайте отдельный класс и вставьте код класса NonHierarchicalDstanceBasedAlgorithm.

 public class CustomNonHierarchicalDistanceBasedAlgorithm<MarkerItem extends ClusterItem> implements Algorithm<MarkerItem> { //copy code here } 

После этого найдите метод removeItem и замените его на этот код:

 @Override public void removeItem(MarkerItem item) { final Collection<QuadItem<MarkerItem>> items = new ArrayList<QuadItem<MarkerItem>>(); final PointQuadTree<QuadItem<MarkerItem>> quadTree = new PointQuadTree<QuadItem<MarkerItem>>(0, 1, 0, 1); for (QuadItem<MarkerItem> temp : mItems) { if (item.getPosition() != temp.getPosition()) { synchronized (quadTree) { items.add(temp); quadTree.add(temp); } } } clearItems(); for (QuadItem<MarkerItem> temp : items) { synchronized (mQuadTree) { mItems.add(temp); mQuadTree.add(temp); } } } 

После этого создайте свой ClusterManager и вставьте код ниже, содержащий имя вашего класса:

 clusterManager.setAlgorithm(new CustomNonHierarchicalDistanceBasedAlgorithm<MarkerItem>()); 

Где ваш MarkerItem – ваш класс, который реализовал ClusterItem. И теперь он должен работать.

Не забудьте повторно открыть ClusterManager после удаления элемента, запустив:

 clusterManager.cluster(); 

Я нашел removeItem(T item) в исходном коде ClusterManager.java Tested, он работает Ссылка на исходный код https://github.com/googlemaps/android-maps-utils/blob/master/library/src/com/ Google / карты / Android / кластеризация / ClusterManager.java