在Android中使用聚类算法时如何进行标记标签处理

9
        Marker marker = mMap.addMarker(markerOptions);
        marker.setTag(poi.getKey());
        marker.hideInfoWindow();
        builder.include(marker.getPosition()); 

这段代码能够正常运行是因为我手动添加了所有的标记。我使用了哈希键来检索我的Pin,同时也使用了marker.tag()
我想要使用mClusterManager.addItem()这个方法,但是我还想获取标记的标签信息,所以我不想用Marker marker = mMap.addMarker(markerOptions);将其添加到地图上。
如何解决这个问题呢?
我想进一步说明。
public class PoiItem implements ClusterItem{
private final LatLng mPosition;
private String mTitle;
private String mSnippet;
private String tag;
private ResponsePoi pois;

public PoiItem(ResponsePoi poi,double lat, double lng,String tag) {
    mPosition = new LatLng(lat, lng);
    pois = poi;
    mTitle = poi.getName();
    mSnippet = poi.getAddress();
    this.tag = tag;
}


 private void setMyCluster(){
        mClusterManager = new ClusterManager<PoiItem>         (MainActivity.this,mMap);
        mMap.setOnCameraIdleListener(mClusterManager);
        mMap.setOnMarkerClickListener(mClusterManager);
    }

    setMyCluster();
    for(HashMap.Entry<String, ResponsePoi> poi : pois.entrySet()) {
        MarkerOptions markerOptions = new MarkerOptions()
                .snippet(poi.getValue().getAddress())
                .title(poi.getValue().getName())
                .position(new LatLng(poi.getValue().getLocation().getL().get(0),poi.getValue().getLocation().getL().get(1)))
                .icon(BitmapDescriptorFactory.fromBitmap(smallMarker));
        /*
        Marker marker = mMap.addMarker(markerOptions);
        marker.setTag(poi.getKey());
        marker.hideInfoWindow();
        builder.include(marker.getPosition());  */

        mClusterManager.addItem(new   PoiItem(poi.getValue(),poi.getValue().getLocation().getL().get(0),poi.getValue().getLocation().getL().get(1),poi.getKey()));
    }
1个回答

8
您可以在自定义的MyItem类中添加一个标记标签字段。
例如:
public class MyItem implements ClusterItem {
    private final LatLng mPosition;
    private final String mTitle;
    private final String mSnippet;
    private final String mTag; // <- This is the tag

    public MyItem(double lat, double lng, String t, String s, String tg) {
        mPosition = new LatLng(lat, lng);
        mTitle = t;
        mSnippet = s;
        mTag = tg;
    }

    @Override
    public LatLng getPosition() {
        return mPosition;
    }

    public String getTitle(){
        return mTitle;
    }

    public String getSnippet(){
        return mSnippet;
    }

    public String getTag(){
        return mTag;
    }
}

当使用 addItem() 方法时,将标签给予 MyItem 构造函数:

MyItem item = new MyItem(lat, lng, "title", "snippet", poi.getKey());
mClusterManager.addItem(item);

确保集群管理器处理集群项的点击事件:

mClusterManager.setOnClusterItemClickListener(mClusterItemClickListener);
mMap.setOnMarkerClickListener(mClusterManager);

接下来,定义你的ClusterManager.OnClusterItemClickListener,当点击聚合标记(Marker)时,你可以访问标记(Marker)的标签:

public ClusterManager.OnClusterItemClickListener<MyItem> mClusterItemClickListener = new ClusterManager.OnClusterItemClickListener<MyItem>() {

    @Override
    public boolean onClusterItemClick(MyItem item) {
        if (item.getTag().equals("SomeValue")) {
            //Do something!
        }
        return true;
    }
};

首先,非常感谢您的回答。我也这么认为。但我的标签是哈希值。所以我不知道哪个等于其他的。您有什么建议吗? - TeyteyLan
我现在明白了。完美的答案!谢谢@DanielNugent - TeyteyLan
ClusterManager.OnClusterItemClickListener不起作用,因为onMarkerClick(Marker marker)的原因。我在哪里调用这个方法? - TeyteyLan
@TeyteyLan 确保在调用 mMap.setOnMarkerClickListener(mClusterManager); 之前调用 mClusterManager.setOnClusterItemClickListener(mClusterItemClickListener); - Daniel Nugent
1
此外,如需更多信息(包括InfoWindow相关内容),请参见我在此处的其他答案:https://dev59.com/_10Z5IYBdhLWcg3w4jhy#30959578。 - Daniel Nugent
感谢您再次的关注。@Daniel - TeyteyLan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接