【问题标题】:Android, callback when map clustering is completedAndroid,地图聚类完成时回调
【发布时间】:2016-09-28 09:24:28
【问题描述】:

我在我的应用程序中使用 Google 地图及其集群实用程序。集群本身工作正常,但是当我尝试处理配置更改时遇到了问题。

这是我的情况:

  1. 用户在屏幕上看到一张地图,即fragment
  2. 完成聚类后,地图上会出现标记。用户可以与markers互动。
  3. 当用户选择marker 时,它会突出显示,BottomSheet 会展开显示。

如果用户旋转屏幕(即发生配置更改),我会保存使用 onSaveInstanceState 选择的标记(实际上我不保存标记本身,而只保存指向相关 List 条目的链接,如 ID)。然后,我想恢复配置更改之前的用户选择。

集群本身是这样执行的:

clusterManager.clearItems();
clusterManager.addItems(eventManager.getEventList());
clusterManager.cluster(); 

当从服务器接收到数据时执行此代码。执行集群时,所有markers 显然也会重新创建。所以为了突出以前的用户选择(以前的marker),我必须知道集群实用程序何时完成它的操作。到那时,我确信我可以安全地使用以下功能:

clusterManager.getRenderer()).getMarker(<param>)

clusterManager.getRenderer()).getClusterItem(<param>)

否则,如果集群任务尚未完成,这些有时会返回null

但是,我找不到合理的方法,即在集群完成后如何从集群实用程序(即ClusterManager)获得响应。我想我需要更新这个标准的聚类代码:

 /**
     * Runs the clustering algorithm in a background thread, then re-paints when results come back.
     */
    private class ClusterTask extends AsyncTask<Float, Void, Set<? extends Cluster<T>>> {
        @Override
        protected Set<? extends Cluster<T>> doInBackground(Float... zoom) {
            mAlgorithmLock.readLock().lock();
            try {
                return mAlgorithm.getClusters(zoom[0]);
            } finally {
                mAlgorithmLock.readLock().unlock();
            }
        }

        @Override
        protected void onPostExecute(Set<? extends Cluster<T>> clusters) {
            mRenderer.onClustersChanged(clusters);
        }
    }

我认为,onPostExecute 不应该只向Renderer 提供响应,而是应该向ClusterManager 的用户(如我的fragment)提供集群已完成的响应。但我不想修改标准代码。

有没有更好的方法来处理这种情况?

【问题讨论】:

  • 您是否尝试过使用OnMapLoadedCallback?根据文档 (developers.google.com/android/reference/com/google/android/gms/…),当地图完成渲染时会调用 onMapLoaded()
  • 嗯,可能没问题,但问题是我可以在从服务器接收到数据后立即绘制标记和集群,但有时在接收到数据之前加载地图(由于连接问题等) )。所以这可能行不通。
  • 你有什么方法可以监听集群完成事件吗?

标签: android google-maps google-maps-android-api-2 markerclusterer


【解决方案1】:

您以错误的方式处理此问题。

你应该实现:

class YourClusterItemRenderer extends DefaultClusterRenderer<YourClusterItem>

并将其设置为 ClusterManager 作为渲染器,如下所示:

mClusterManager.setRenderer(new YourClusterItemRenderer(...));

覆盖 YourClusterItemRenderer 的方法 onBeforeClusterItemRenderedonBeforeClusterRendered,然后您可以根据您的逻辑根据服务器参数更改每个标记的外观。

因此,当 ClusterManager 完成渲染所有标记时,根据用户状态等,您的所有标记已经看起来像您想要的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 2019-09-30
    • 1970-01-01
    相关资源
    最近更新 更多