在我的Android应用程序中,我必须在我的GoogleMap中删除并重新添加一个代表我当前位置的群集项。但是当我运行这段代码时:
clusterMng.remove(myitem);
我得到了这个例外:
java.lang.UnsupportedOperationException: NonHierarchicalDistanceBasedAlgorithm.remove
not implemented.
有人可以向我解释这意味着什么吗? 我是否必须在外部库中重写一些ClusterManager.java方法?或者我可以简单地更改我的算法吗?
答案 0 :(得分:14)
默认 ClusterManager 使用 NonHierarchicalDistanceBasedAlgorithm ,但不实现删除元素。
尝试使用 GridBasedAlgorithm (它支持删除元素):
clusterMng.setAlgorithm(new GridBasedAlgorithm<MyClusterItem>());
或者,为了获得更好的性能,请使用 PreCachingAlgorithmDecorator 包装它,正如ClusterManager默认执行的那样:
clusterMng.setAlgorithm(new PreCachingAlgorithmDecorator<MyClusterItem>(new GridBasedAlgorithm<MyClusterItem>()));
答案 1 :(得分:8)
正如@SergePopulov所说,NonHierarchicalDistanceBasedAlgorithm没有实现删除元素。对于那些不想使用GridBasedAlgoritm但仍需要从NonHierarchicalDistanceBasedAlgorithm中删除单个元素的人,还有另一种解决方案。
使用此链接(Source),您可以找到开发人员在github中提供的NonHierarchicalDistanceBasedAlgorithm的源代码。
我所做的只是保存旧的Cluster项,清除clusterManager并再次添加旧项,但不添加通过该方法传递的项。
首先创建一个单独的类并粘贴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.cluster();
答案 2 :(得分:7)
我是这样做的:
@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
,因为在NonHierarchicalDistanceBasedAlgorithm
源代码的TODO中建议:
@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();
}
最后,我在equals()
的后代课程中实施了hashCode()
和ClusterItem
。
答案 3 :(得分:1)
将android-maps-utils
更新为0.5
clusterManager.remove(item);
永远不会抛出UnsupportedOperationException("NonHierarchicalDistanceBasedAlgorithm.remove not implemented")
答案 4 :(得分:0)
我在ClusterManager.java的源代码中找到了@keyframes <animation name>
{
0%,25%
{
animation here
}
75%,100%
{
animation here
}
}
经测试,它的工作原理
链接到源代码https://github.com/googlemaps/android-maps-utils/blob/master/library/src/com/google/maps/android/clustering/ClusterManager.java