从clustermanager中删除项目的问题

Don*_*Dev 11 android google-maps marker google-maps-android-api-2

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

clusterMng.remove(myitem);
Run Code Online (Sandbox Code Playgroud)

我得到这个例外:

java.lang.UnsupportedOperationException: NonHierarchicalDistanceBasedAlgorithm.remove    
not implemented.
Run Code Online (Sandbox Code Playgroud)

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

Ser*_*lov 14

默认情况下,ClusterManager使用NonHierarchicalDistanceBasedAlgorithm,它不实现删除元素.

尝试使用GridBasedAlgorithm(它支持删除元素):

clusterMng.setAlgorithm(new GridBasedAlgorithm<MyClusterItem>());
Run Code Online (Sandbox Code Playgroud)

或者,为了获得更好的性能,请使用PreCachingAlgorithmDecorator将其包装,正如ClusterManager默认执行的那样:

clusterMng.setAlgorithm(new PreCachingAlgorithmDecorator<MyClusterItem>(new GridBasedAlgorithm<MyClusterItem>()));
Run Code Online (Sandbox Code Playgroud)


Arū*_*kas 8

正如@SergePopulov所说,NonHierarchicalDistanceBasedAlgorithm没有实现删除元素.对于那些不想使用GridBasedAlgoritm但仍需要从NonHierarchicalDistanceBasedAlgorithm中删除单个元素的人,还有另一种解决方案.

使用此链接(Source),您可以找到开发人员在github中提供的NonHierarchicalDistanceBasedAlgorithm的源代码.

我所做的只是保存旧的Cluster项,清除clusterManager并再次添加旧项,但不添加通过该方法传递的项.

首先创建一个单独的类并粘贴NonHierarchicalDstanceBasedAlgorithm类代码.

public class CustomNonHierarchicalDistanceBasedAlgorithm<MarkerItem extends ClusterItem> implements Algorithm<MarkerItem>
{
    //copy code here
}
Run Code Online (Sandbox Code Playgroud)

之后找到方法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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

之后转到创建ClusterManager的位置并粘贴下面包含您的类名的代码:

clusterManager.setAlgorithm(new CustomNonHierarchicalDistanceBasedAlgorithm<MarkerItem>());
Run Code Online (Sandbox Code Playgroud)

MarkerItem是实现ClusterItem的类.它现在应该工作了.

通过运行删除项目后,不要忘记重新集群ClusterManager:

clusterManager.cluster();
Run Code Online (Sandbox Code Playgroud)


Via*_*huk 8

我是这样做的:

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

我还实施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();
}
Run Code Online (Sandbox Code Playgroud)

最后,我实施equals()hashCode()在我ClusterItem的后代课堂上.