我正在我的应用程序中使用Google Maps及其聚类实用程序。聚类本身运作良好,但是当我尝试处理配置更改时出现问题。
这是我的情况:
1.用户在屏幕上看到一个地图,它是一个碎片。 2.当聚类完成时,地图上的标记会出现。用户可以与标记交互。 3.当用户选择一个标记时,它将被突出显示并展开以显示底部表格。
如果用户旋转屏幕(即发生配置更改),我会使用onSaveInstanceState保存所选的标记(实际上我不保存标记本身,而只是保存相关List条目的链接,比如ID)。然后,我想恢复之前的用户选择。
聚类本身是这样执行的:
否则,如果集群任务尚未完成,则这些内容有时会返回
然而,我无法找到一个合理的方法来获取集群实用程序(即
这是我的情况:
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
)提供聚类完成的信息。但我不想修改标准代码。
有没有更好的处理方法?
OnMapLoadedCallback
吗?根据文档(https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.OnMapLoadedCallback),当地图渲染完成时,将调用onMapLoaded()
。 - antonio