从clustermanager中删除项目的问题

时间:2014-02-26 17:31:10

标签: android google-maps google-maps-android-api-2 marker

在我的Android应用程序中,我必须在我的GoogleMap中删除并重新添加一个代表我当前位置的群集项。但是当我运行这段代码时:

clusterMng.remove(myitem);

我得到了这个例外:

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

有人可以向我解释这意味着什么吗? 我是否必须在外部库中重写一些ClusterManager.java方法?或者我可以简单地更改我的算法吗?

5 个答案:

答案 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")

Refer this thread

答案 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