ClusterManager重绘Google map v2 utils的标记

PaN*_*TEC 19 android android-maps-v2 android-maps-utils

嗨我正在发出服务器请求,当我收到来自服务器的请求时,我正在Ui Thread上执行一个ClusterManager.addItem(),但这些项目不会在地图中绘制,只有当我进行缩放更新(+, - )时正在显示.此外,我尝试调试渲染器,但是直到我更新地图中的缩放才调用onBeforeClusterRendered/onBeforeClusterItemRendered.有关如何刷新map/clusterManager/markers的任何想法?

        MarkerManager markerManager = new MarkerManager(map);
        clusterManager = new ClusterManager<TweetClusterItem>(getActivity(), map, markerManager);
        clusterManager.setRenderer(new TweetClusterRenderer(getActivity(), map, clusterManager, defaultMarker));
        clusterManager.setOnClusterClickListener(this);
        clusterManager.setOnClusterInfoWindowClickListener(this);
        clusterManager.setOnClusterItemClickListener(this);
        clusterManager.setOnClusterItemInfoWindowClickListener(this);

        UiSettings uiSettings = map.getUiSettings();
        uiSettings.setZoomControlsEnabled(true);
        uiSettings.setMyLocationButtonEnabled(false);

        map.setOnCameraChangeListener(clusterManager);
        map.setOnMarkerClickListener(clusterManager);
        map.setOnInfoWindowClickListener(clusterManager);
        map.setOnMapClickListener(this);
Run Code Online (Sandbox Code Playgroud)

小智 25

mClusterManager.cluster();

添加新项目后强制重新聚类项目.

  • 是的,但不要强制重新绘制标记. (2认同)

PaN*_*TEC 15

似乎我发现了一种解决方法.

ClusterManager使用渲染器,在这种情况下,它继承自DefaultClusterRenderer,后者使用内部缓存,即添加到地图的标记缓存.你可以直接访问地图上添加的标记,我不使用信息窗口,所以我添加标记options.title()一个ID,以便以后找到这个标记,所以:

@Override
protected void onBeforeClusterItemRendered(TweetClusterItem item, MarkerOptions markerOptions) {

     .... Blabla code....          
            markerOptions.title(Long.toString(tweet.getId()));
     .... Blabla code....


}
Run Code Online (Sandbox Code Playgroud)

当我想重新加载clusterItem时,我调用这个方法:

/**
  * Workarround to repaint markers
  * @param item item to repaint
 */
  public void reloadMarker(TweetClusterItem item) {

        MarkerManager.Collection markerCollection = clusterManager.getMarkerCollection();
        Collection<Marker> markers = markerCollection.getMarkers();
        String strId = Long.toString(item.getTweet().getId());
        for (Marker m : markers) {
            if (strId.equals(m.getTitle())) {
                m.setIcon( ICON TO SET);
                break;
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

也许是有点hacky,但它的工作原理,我没有找到任何其他方式来做到这一点.如果你找到了另一种更好的方法,请分享:)