我有一个简单的应用程序,可以在地图上显示很多标记(谷歌地图)。目前我有超过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)。在之前的方法(改变可见性)几乎是瞬时的(足够快,用户不会感到任何滞后)。但是,现在,我需要每次都添加和删除这些标记,并且存在延迟,这对用户来说非常明显。
有人有任何建议吗?
答案 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();
}