当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《GoogleMapsUtility:如何从ClusterManager<?>获取所有标记?》经验,为你挑选了1个好方法。

对不起我的英语不好

我尝试了该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却没有放置标记在地图上和稍后会做(可在后台线程).如果是这样,那我怎么能抓住那一刻呢?



1> Ethan..:

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

背景:让我们首先从库代码中看一下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 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 items = clusterManagerAlgorithm.getItems();
    

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


好方案!你有一个拼写错误:应该是'clusterManagerAlgorithm = new NonHierarchicalDistanceBasedAlgorithm'(你缺少NonHierarchicalDistanceBasedAlgorithm中的第一个'N')
推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有