Android,地图群集完成后回调

rof*_*ofl 8 android google-maps markerclusterer google-maps-android-api-2

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

这是我的情况:

  1. 用户在屏幕上看到地图,这是一个fragment.
  2. 完成聚类后,将显示地图上的标记.用户可以与之互动markers.
  3. 当用户选择a时marker,它会突出显示并BottomSheet展开以显示.

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

集群本身就像这样执行:

clusterManager.clearItems();
clusterManager.addItems(eventManager.getEventList());
clusterManager.cluster(); 
Run Code Online (Sandbox Code Playgroud)

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

clusterManager.getRenderer()).getMarker(<param>)
Run Code Online (Sandbox Code Playgroud)

clusterManager.getRenderer()).getClusterItem(<param>)
Run Code Online (Sandbox Code Playgroud)

否则,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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我认为,这不仅onPostExecute应该提供响应,而且应该向(像我)Renderer的用户提供响应,即群集完成.但我不想修改标准代码.ClusterManagerfragment

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

EZD*_*sIt 2

你的处理方式是错误的。

您应该实施:

class YourClusterItemRenderer extends DefaultClusterRenderer<YourClusterItem>
Run Code Online (Sandbox Code Playgroud)

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

mClusterManager.setRenderer(new YourClusterItemRenderer(...));
Run Code Online (Sandbox Code Playgroud)

重写 YourClusterItemRenderer 的方法onBeforeClusterItemRenderedonBeforeClusterRendered您可以根据服务器的参数根据您的逻辑更改每个标记的外观。

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