如何向ClusterItem添加标题、片段和图标?

11

我有这个活动:

public class MapViewer extends Activity {

    private GoogleMap map;
    private Database db = new Database(this);

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mapviewer);

        try {
            map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
            if (map != null) {
                map.setMyLocationEnabled(true);
                map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
                map.getUiSettings().setRotateGesturesEnabled(false);

                this.addMerchantMarkers(new MarkerOptions());
            }
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    }

    public void addMerchantMarkers(MarkerOptions mo) {
        SQLiteDatabase dbRead = db.getReadableDatabase();
        Cursor result = dbRead.rawQuery("SELECT title, addr, lat, lon FROM users", null);

        while(result.moveToNext()) {            
            map.addMarker(mo.position(new LatLng(result.getFloat(2), result.getFloat(3)))
                    .title(result.getString(0))
                    .snippet(result.getString(1))
                    );;
        }
    }
}

我按照以下方式更改了它,以使用标记聚类:

public class MapViewer extends Activity {

    private GoogleMap map;
    private Database db = new Database(this);
    private ClusterManager<MyItem> mClusterManager;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mapviewer);

        try {
            map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
            if (map != null) {
                map.setMyLocationEnabled(true);
                map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
                map.getUiSettings().setRotateGesturesEnabled(false);

                setUpClusterer();
            }
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    }

    private void setUpClusterer() {
        mClusterManager = new ClusterManager<MyItem>(this, map);

        map.setOnCameraChangeListener(mClusterManager);
        map.setOnMarkerClickListener(mClusterManager);

        addItems();
    }

    private void addItems() {
        SQLiteDatabase dbRead = db.getReadableDatabase();
        Cursor result = dbRead.rawQuery("SELECT lat, lon, title, addr FROM users", null);

        while(result.moveToNext()) {
            MyItem offsetItem = new MyItem(result.getFloat(0), result.getFloat(1));
            mClusterManager.addItem(offsetItem);
        }
    }
}

现在我不知道如何像之前的代码那样为每个标记添加标题、摘要和图标。现在,如果我点击单个标记,什么都不会发生...怎么办?

1个回答

53

在这里,您应该与ClusterManager本身一起工作。例如,设置群集项单击:

        mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
            @Override
            public boolean onClusterItemClick(MyItem item) {
                //put your code here
                return false;
            }
        });

ClusterManager类中还有其他不同的方法。您需要使用更加隐晦的代码来将信息窗口分配给标记或聚合 - 您应该使用此代码:

而且 ClusterManager 类中还有其他不同的方法。您需要使用较为隐晦的代码来将信息窗口分配给标记或聚合 - 您应该使用以下代码:

mClusterManager.getMarkerCollection().setOnInfoWindowAdapter(new MarkerInfoWindowAdapter());
mClusterManager.getClusterMarkerCollection().setOnInfoWindowAdapter(new ClusterInfoWindow());

有 MarkerInfoWindowAdapter 和 ClusterWindowAdapter 两个类,它们都实现了 GoogleMap.InfoWindowAdapter 接口。

使用图标会稍微有些难度,因为聚合会将图标更改为默认的。您可以使用以下方法:

public void setRenderer(com.google.maps.android.clustering.view.ClusterRenderer<T> view)

您可以编写自己的渲染器类并覆盖一些方法。例如,要设置自定义图标,请使用这样的类:

class OwnIconRendered extends DefaultClusterRenderer<MyItem> {

    public OwnIconRendered(Context context, GoogleMap map,
                           ClusterManager<MyItem> clusterManager) {
        super(context, map, clusterManager);
    }

    @Override
    protected void onBeforeClusterItemRendered(MyItem item, MarkerOptions markerOptions) {
        markerOptions.icon(item.getIcon());
        markerOptions.snippet(item.getSnippet());
        markerOptions.title(item.getTitle());
        super.onBeforeClusterItemRendered(item, markerOptions);
    }
}

并以如下方式使用:

mClusterManager.setRenderer(new OwnIconRendered(activity.getApplicationContext(), getMap(), mClusterManager));

不用担心图标的问题。你有一些示例可以展示如何将标题和片段添加到位于聚类内部的标记吗? - smartmouse
2
您可以像添加图标一样添加标题和片段 - 在 onBeforeClusterRendered 方法中(请参见答案),使用 markerOptions 对象的 title(String title) 和 snippet(String snippet) 方法。 - Vasilov Artur
第二个选项完美地运行且易于实现。谢谢 ;) - BrunoRamalho
嗨,我有3个带有3种类型的图标,我该如何在“OwnIconRendered”中更改类型? - user3402040
如何更改集群图像而不是标记图像? - Muhammad Younas

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