正如@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();