如何使用Cluster Manager更改Google Map上标记的可见性? (机器人)

时间:2018-04-19 21:44:38

标签: android google-maps

我有一个简单的应用程序,可以在地图上显示很多标记(谷歌地图)。目前我有超过3,000个标记,随着数据库变大,这个数字不断增长。

我还有一些复选框,用于指示要显示哪些标记,反之亦然。

最初我正在添加这样的每个标记(在一个遍历每个位置的循环内)

Marker marker;
marker = mMap.addMarker (markerOptions);
mMarkerArrayList.add(marker);

然后当用户与复选框交互时,我只是使标记可见/不可见。这样可以更快地删除并重新添加标记。 Checkbox Change Listener中的代码如下所示:

for (Marker marker : mMarkerArrayList) {
    if (condition) {
        marker.setVisible(false);
    }
}

然后在复选框的另一个更改时再次显示。

但是,在开始时单独添加所有这些标记需要花费很长时间(1-2秒)并且因为标记只能添加到UI线程中,所以它冻结了UI(包括我的进度条)时间量。

经过大量的研究,并没有到达任何地方,我唯一能做的就是使用ClusterManager(android-maps-utils库)添加标记。这加载速度提高了两倍,并且不会阻止我的UI。 添加代码是这样的(这里myLocation是我的MyLocation类的对象,它保存每个点的lcoation和相关数据。)

for (MyLocation myLocation : mMyLocationArrayList) {
    mClusterManager.addItem(myLocation)
}

现在问题是将复选框链接到这些ClusterItem对象。我在库中找不到任何方法或字段来更改这些标记的可见性(ClusterItem)。在之前的方法(改变可见性)几乎是瞬时的(足够快,用户不会感到任何滞后)。但是,现在,我需要每次都添加和删除这些标记,并且存在延迟,这对用户来说非常明显。

有人有任何建议吗?

2 个答案:

答案 0 :(得分:2)

您应该能够使用mClusterManager.getMarkerCollection().getMarkers()来获取Marker集合,然后以与以前相同的方式隐藏某些标记:

Collection<Marker> markerCollection = mClusterManager.getMarkerCollection().getMarkers();

for (Marker marker : markerCollection) {
    if (condition) {
        marker.setVisible(false);
    }
}

答案 1 :(得分:1)

@Khash我在以下代码上取得了一些成功(即同时隐藏了标记和聚类),尽管在放大或缩小地图以重新显示标记和聚类时遇到了类似的问题。 希望对您有所帮助,祝您编程愉快!

if (hide) {
    /* Hide all Markers and Clusters */
    mMyClusterManager.getMarkerCollection().hideAll();
    mMyClusterManager.getClusterMarkerCollection().hideAll();
} else {
    /* Show all Markers and Clusters */
    mMyClusterManager.getMarkerCollection().showAll();
    mMyClusterManager.getClusterMarkerCollection().showAll();
}