我有一个应用程序,我正在处理我在地图上绘制各种兴趣点的地方。有5种不同类型的POI,我添加了按类型过滤的功能。我能够正确地实现标记的聚类,并且我还按类型实现了对各个标记的过滤而没有任何问题,但是我无法弄清楚如何按类型过滤包含在Cluster中的标记,然后让实用程序重新绘制它的簇。
为了按类型过滤标记,我创建了自己的CustomClusterRenderer并覆盖了onClusterItemRendered:
@Override
protected void onClusterItemRendered(AbstractPOI clusterItem, Marker marker) {
// TODO Auto-generated method stub
super.onClusterItemRendered(clusterItem, marker);
if (mClusterManager.getMarkerMap().get(clusterItem.getPosition()) == null) {
/*
* Save a reference to the appropriate filter array by type.
*/
if (MapUtils.TYPE_HOTEL.equals(marker.getSnippet())) {
mClusterManager.getHotelMarkers().add(marker);
} else if (MapUtils.TYPE_PARK.equals(marker.getSnippet())) {
mClusterManager.getParkMarkers().add(marker);
} else if (MapUtils.TYPE_PROVIDER.equals(marker.getSnippet())) {
mClusterManager.getProviderMarkers().add(marker);
} else if (MapUtils.TYPE_RESTAURANT.equals(marker.getSnippet())) {
mClusterManager.getRestaurantMarkers().add(marker);
}
/*
* Save this marker to our marker map to prevent duplicates.
*/
mClusterManager.getMarkerMap().put(clusterItem.getPosition(), marker);
}
}
如果某种方式它也意味着标记不包含在缩放期间创建的簇中,这可能最终会出现问题。我不确定。上面的方法保留了对标记的引用,以便在我的CustomClusterManager中,我可以包含用于循环这些标记并设置其“可见”属性的函数:
public void toggleHotelFilter(boolean visible) {
for (Marker marker : mHotelMarkers) {
marker.setVisible(visible);
}
cluster();
}
可能有更好的方法可以做到这一点,但到目前为止,它似乎确实有效。接下来的部分是让过滤器也进入Clusters并抽出正在过滤的POI,并更新计数(或根据不可见的数量完全删除集群)。
我使用的是google-maps-utils库