Android,地图聚合完成时的回调函数

9
我正在我的应用程序中使用Google Maps及其聚类实用程序。聚类本身运作良好,但是当我尝试处理配置更改时出现问题。
这是我的情况:
1.用户在屏幕上看到一个地图,它是一个碎片。 2.当聚类完成时,地图上的标记会出现。用户可以与标记交互。 3.当用户选择一个标记时,它将被突出显示并展开以显示底部表格。
如果用户旋转屏幕(即发生配置更改),我会使用onSaveInstanceState保存所选的标记(实际上我不保存标记本身,而只是保存相关List条目的链接,比如ID)。然后,我想恢复之前的用户选择。
聚类本身是这样执行的:
clusterManager.clearItems();
clusterManager.addItems(eventManager.getEventList());
clusterManager.cluster(); 

当从服务器接收到数据时,将执行此代码。当执行聚类时,显然会重新创建所有的标记。因此,为了突出先前用户的选择(先前的标记),我必须知道何时聚类实用程序完成其操作。到那时,我可以放心使用这样的函数:

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)提供聚类完成的信息。但我不想修改标准代码。

有没有更好的处理方法?


1
你尝试过使用 OnMapLoadedCallback 吗?根据文档(https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.OnMapLoadedCallback),当地图渲染完成时,将调用 onMapLoaded() - antonio
可能这样做没问题,但问题在于有时候由于连接问题等原因,数据接收之后我才能绘制标记和聚类,但有时地图会在数据接收之前加载。所以这种方法可能行不通。 - rofl
你找到监听集群完成事件或类似事件的方法了吗? - Community
1个回答

2
你正在错误的方式上进行。你应该实现:

你需要实现:

class YourClusterItemRenderer extends DefaultClusterRenderer<YourClusterItem>

并将其设置为 ClusterManager 的渲染器,像这样:

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

覆盖您的ClusterItemRenderer的方法onBeforeClusterItemRenderedonBeforeClusterRendered,在那里您可以根据来自服务器的参数根据逻辑更改每个标记的外观。

因此,当ClusterManager完成渲染时,所有标记已根据用户状态等呈现为您想要的样子。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接