正如@SergePopulov所说,NonHierarchicalDistanceBasedAlgorithm不实现删除元素的功能。对于那些不想使用GridBasedAlgoritm但仍然需要从NonHierarchicalDistanceBasedAlgorithm中删除单个元素的人,有另一种解决方案。
通过此链接(
源代码),您可以在github中找到由开发人员提供的NonHierarchicalDistanceBasedAlgorithm的源代码。
我所做的就是保存旧的集群项,清除clusterManager,然后再次添加旧的项,但不添加通过该方法传递的项。
首先创建一个单独的类,并粘贴NonHierarchicalDstanceBasedAlgorithm类代码。
public class CustomNonHierarchicalDistanceBasedAlgorithm<MarkerItem extends ClusterItem> implements Algorithm<MarkerItem>
{
}
接下来找到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();
PreCachingAlgorithmDecorator
包装算法是不必要的,因为它在setAlgorithm()
方法中自动完成了这个过程。 - Jeff Lockhart