android – Google Maps Utility:如何从ClusterManager <?>获取所有标记?

前端之家收集整理的这篇文章主要介绍了android – Google Maps Utility:如何从ClusterManager <?>获取所有标记?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对不起我的英语不好

我尝试了ClusterManager<?> .getMarkerCollection().getMarkers()方法,但它返回空集合.

我在我的应用中使用Google Maps Utility Library.每次屏幕旋转后,我都会创建AsynkTask并在后台线程中从DB读取数据并将项目添加到ClusterManager:

cursor.moveToFirst();
while (!cursor.isAfterLast()) {
    SomeData row = readSomeDataRow(cursor);
    clusterManager.addItem(new ClusterItemImpl(row));
    cursor.moveToNext();
}

当AsyncTask完成其工作(即在主线程中)时,我试图从ClusterManager获取所有标记

clusterManager.cluster();
// cluster manager returns empty collection  \|/
markers = clusterManager.getMarkerCollection().getMarkers();

但ClusterManager返回空集合.

可能正好在我调用getMarkers()的时候,ClusterManager还没有在地图上放置标记,稍后会这样做(可能在后台线程中).如果是这样,那我怎么能抓住那一刻呢?

解决方法

我会给你一个很好的解决方法.首先,我将给出一些背景知识.然后,我将告诉您修改代码的简单方法.

背景:让我们首先看一下库代码中ClusterManager.addItem的实现:

public void addItem(T myItem) {
    this.mAlgorithmLock.writeLock().lock();

    try {
        this.mAlgorithm.addItem(myItem);
    } finally {
        this.mAlgorithmLock.writeLock().unlock();
    }

}

如您所见,当您调用clusterManager.addItem时,ClusterManager会调用this.mAlgorithm.addItem. mAlgorithm是存储项目的地方.现在让我们看一下ClusterManager的默认构造函数

public ClusterManager(Context context,GoogleMap map,MarkerManager markerManager) {
    ...
    this.mAlgorithm = new PreCachingAlgorithmDecorator(new  NonHierarchicalDistanceBasedAlgorithm());
    ...        
}

mAlgorithm被实例化为包含NonHierarchicalDistanceBasedAlgorithm的PreCachingAlgorithmDecorator.不幸的是,由于mAlgorithm被声明为私有,我们无权访问正在添加到算法中的项目.但是,很高兴有一个简单的解决方法!我们只是使用ClusterManager.setAlgorithm实例化mAlgorithm.这允许我们访问算法类.

解决方法:这是您的代码插入了变通方法.

>将此声明与您的类变量一起使用:

private Algorithm<Post> clusterManagerAlgorithm;

>在实例化ClusterManager的位置,之后立即放置:

// Instantiate the cluster manager algorithm as is done in the ClusterManager
 clusterManagerAlgorithm = new NonHierarchicalDistanceBasedAlgorithm();

 // Set this local algorithm in clusterManager
 clusterManager.setAlgorithm(clusterManagerAlgorithm);

>您可以保留用于将项目插入群集的代码完全相同.
>如果要访问插入的项目,只需使用算法而不是ClusterManager:

Collection<ClusterItemImpl> items = clusterManagerAlgorithm.getItems();

这将返回项目而不是Marker对象,但我相信这正是您所需要的.

猜你在找的Android相关文章