【问题标题】:How to change the visibility of markers on Google Map using Cluster Manager? (Android)如何使用集群管理器更改谷歌地图上标记的可见性? (安卓)
【发布时间】:2018-09-30 12:34:51
【问题描述】:

我有一个简单的应用程序,可以在地图(谷歌地图)上显示很多标记。目前我有超过 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 类的对象,它保存每个点的位置和相关数据)。

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

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

有人有什么建议吗?

【问题讨论】:

    标签: android google-maps


    【解决方案1】:

    您应该可以使用mClusterManager.getMarkerCollection().getMarkers() 来获取标记集合,然后像以前一样隐藏某些标记:

    Collection<Marker> markerCollection = mClusterManager.getMarkerCollection().getMarkers();
    
    for (Marker marker : markerCollection) {
        if (condition) {
            marker.setVisible(false);
        }
    }
    

    【讨论】:

    • 非常感谢,效果很好!我还有一个没有涉及的小细节(它与库的设置方式有关)。它可以很好地删除标记,但是如果缩小(意味着有簇),由于簇在该点不是标记,簇仍然存在。有没有办法同时删除这些集群(或者更好地调整它们的成员,使其也反映新的计数)?再次感谢
    • @Khash 你找到解决这个问题的方法了吗?
    • @D.Roters 不是真的,当时我最终放弃了集群并恢复到以前的版本(添加标记并将它们保存在 ArrayList 中,然后操纵单个标记的可见性)。不幸的是,我无法按照我想要的方式进行集群。话虽如此,该项目在过去一年一直处于自动驾驶状态,因为我忙于其他工作,所以我不一定会重新审视这个。我计划在接下来的几个月内更新整个项目,所以如果您有任何建议,我将不胜感激
    【解决方案2】:

    @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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      • 2016-04-03
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      相关资源
      最近更新 更多