【问题标题】:How to add title, snippet and icon to ClusterItem?如何向 ClusterItem 添加标题、片段和图标?
【发布时间】:2015-02-28 23:17:13
【问题描述】:

我有这个活动:

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);
        }
    }
}

现在我不知道如何像以前的代码一样为每个标记添加标题、sn-p 和图标。 现在,如果我单击单个标记,则不会发生任何事情... 如何获得?

【问题讨论】:

    标签: android google-maps marker clickable markerclusterer


    【解决方案1】:

    在这里您应该使用 ClusterManager 本身。 例如在集群项上设置点击:

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

    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));
    

    【讨论】:

    • 图标无关紧要。您是否有一些示例说明如何将 title 和 sn-p 添加到集群内的标记?
    • 您可以像添加图标一样添加title和sn-p - 在方法onBeforeClusterRendered(见答案)中使用markerOptions对象的方法title(String title)和sn-p(String sn-p) .
    • 第二个选项完美且易于实施。谢谢;)
    • 嗨,我有 3 种类型的 3 个图标,如何在“OwnIconRendered”中更改类型?
    • 如何更改集群图像而不是标记图像?
    猜你喜欢
    • 2020-07-09
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2013-03-29
    相关资源
    最近更新 更多