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)
正如@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)
我是这样做的:
@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
的后代课堂上.
归档时间: |
|
查看次数: |
6680 次 |
最近记录: |