Android在集群标记上打开信息窗口

Android在集群标记上打开信息窗口,android,google-maps,google-maps-markers,Android,Google Maps,Google Maps Markers,我实现了一个从实际位置查找最近标记的选项。我有一个带有自定义信息窗口的ClusterItem中的所有标记。在没有集群的普通谷歌地图上,我可以只使用marker.showInfoWindow()和信息窗口将弹出。在使用聚类时似乎没有这样的方法,因为标记没有作为正确的映射标记添加 我的代码: public class StationsFragment extends Fragment implements OnMapReadyCallback { private static GoogleM

我实现了一个从实际位置查找最近标记的选项。我有一个带有自定义信息窗口的ClusterItem中的所有标记。在没有集群的普通谷歌地图上,我可以只使用
marker.showInfoWindow()和信息窗口将弹出。在使用聚类时似乎没有这样的方法,因为标记没有作为正确的映射标记添加

我的代码:

public class StationsFragment extends Fragment implements OnMapReadyCallback {
    private static GoogleMap googleMap;

    private ClusterManager<MyItem> clusterManager;
    private MyItem clickedClusterItem;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(R.layout.main_activity, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        Utils.changeLanguage(getActivity());

        final SupportMapFragment map = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
        map.getMapAsync(this);
    }

    @Override
    public void onMapReady(final GoogleMap map) {
        googleMap = map;

        map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(0.0, 0.0), 10));
        map.setMyLocationEnabled(true);

        clusterManager = new ClusterManager<>(getActivity(), map);

        map.setOnCameraChangeListener(clusterManager);
        map.setOnMarkerClickListener(clusterManager);
        map.setInfoWindowAdapter(clusterManager.getMarkerManager());

        clusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
            @Override
            public boolean onClusterItemClick(MyItem item) {
                clickedClusterItem = item;
                return false;
            }
        });

        loadMarkers();
    }

    private void loadMarkers() {
        clusterManager.addItem(new MyItem(lat, lng, title, snippet));
    }

    public class ItemAdapter implements GoogleMap.InfoWindowAdapter {

        private final View view;

        ItemAdapter() {
            view = getActivity().getLayoutInflater().inflate(R.layout.info_window, null);
        }

        @Override
        public View getInfoWindow(Marker marker) {
            TextView title = (TextView) view.findViewById(R.id.info_title);
            title.setText(clickedClusterItem.getTitle());

            TextView snippet = (TextView) view.findViewById(R.id.info_snippet);
            snippet.setText(clickedClusterItem.getSnippet());

            return view;
        }

        @Override
        public View getInfoContents(Marker marker) {
            return null;
        }
    }

    public class MyItem implements ClusterItem {
        private final LatLng position;
        private final String title;
        private final String snippet;

        public MyItem(double lat, double lng, String title, String snippet) {
            this.position = new LatLng(lat, lng);
            this.title = title;
            this.snippet = snippet;
        }

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

        public String getTitle(){
            return title;
        }

        public String getSnippet(){
            return snippet;
        }
    }
}
public类StationsFragment扩展了mapreadycallback上的片段实现{
私有静态谷歌地图;
私人俱乐部经理俱乐部经理;
private MyItem Clicked ClusterItem;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
返回充气机。充气(R.layout.main_活动,容器,错误);
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
Utils.changeLanguage(getActivity());
final SupportMapFragment map=(SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map);
getMapAsync(this);
}
@凌驾
4月1日公开作废(谷歌地图最终版){
谷歌地图=地图;
移动摄像机(CameraUpdateFactory.newLatLngZoom(新LatLng(0.0,0.0,10));
map.setMyLocationEnabled(true);
clusterManager=新的clusterManager(getActivity(),map);
map.SetonCamerachenglistener(clusterManager);
setOnMarkerClickListener(clusterManager);
setInfoWindowAdapter(clusterManager.getMarkerManager());
setOnClusterItemClickListener(新的clusterManager.OnClusterItemClickListener(){
@凌驾
公共布尔onClusterItemClick(MyItem){
单击ClusterItem=项目;
返回false;
}
});
loadMarkers();
}
私有void loadMarkers(){
addItem(新的MyItem(lat、lng、title、snippet));
}
公共类ItemAdapter实现GoogleMap.InfoWindowAdapter{
私人最终视图;
ItemAdapter(){
视图=getActivity().GetLayoutFlater().inflate(R.layout.info_窗口,空);
}
@凌驾
公共视图getInfoWindow(标记器){
TextView title=(TextView)view.findViewById(R.id.info\u title);
title.setText(clickedClusterItem.getTitle());
TextView片段=(TextView)view.findViewById(R.id.info\u片段);
setText(clickedClusterItem.getSnippet());
返回视图;
}
@凌驾
公共视图getInfoContents(标记器){
返回null;
}
}
公共类MyItem实现ClusterItem{
私人最终职位;
私人最终字符串标题;
私有最终字符串片段;
公共MyItem(双lat、双lng、字符串标题、字符串片段){
此位置=新车床(车床,lng);
this.title=标题;
this.snippet=代码段;
}
@凌驾
公共位置(){
返回位置;
}
公共字符串getTitle(){
返回标题;
}
公共字符串getSnippet(){
返回代码段;
}
}
}

通过覆盖渲染器,可以在集群项目上显示信息窗口:

override fun onClusterItemRendered(clusterItem: MarkerItem?, marker: Marker?) {
        super.onClusterItemRendered(clusterItem, marker)
        getMarker(clusterItem).showInfoWindow()
    }

请检查,这将逐个显示所有项目的信息窗口,并且只有最后一个项目窗口可见

您似乎没有clusterManager。clusterManager的cluster()方法 将标记项添加到clusterManager后,需要添加并调用此方法

有关群集自定义,请查找以下代码:

    private class CustomMapClusterRenderer<T extends ClusterItem> extends DefaultClusterRenderer<T> {
            CustomMapClusterRenderer(Context context, GoogleMap map, ClusterManager<T> clusterManager) {
                super(context, map, clusterManager);
            }

            @Override
            protected boolean shouldRenderAsCluster(Cluster<T> cluster) {
                //start clustering if 2 or more items overlap
                return cluster.getSize() >= Constants.MINIMUM_CLUSTER_SIZE;
            }

            @Override
            protected void onBeforeClusterItemRendered(T item,
                                                       MarkerOptions markerOptions) {
                ClusterMarkerItem markerItem = (ClusterMarkerItem) item;
                markerOptions.icon(markerItem.getmBitmapDescriptor());
            }  
            @Override
            protected void onBeforeClusterRendered(Cluster<T> cluster, MarkerOptions markerOptions) {
// for dynamically change custom map markericon
                BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(R.drawable.pin_cluster);
                markerOptions.icon(descriptor);
            }

            @Override
            protected void onClusterRendered(Cluster<T> cluster, Marker marker) {
                super.onClusterRendered(cluster, marker);
    //add infowindow to cluster icon
                marker.setTitle("count");
                marker.setSnippet("Total Count - " + cluster.getItems().size());
            }
        }
私有类CustomMapClusterRenderer扩展了DefaultClusterRenderer{
CustomMapClusterRenderer(上下文上下文、Google地图、ClusterManager ClusterManager){
超级(上下文、地图、群集管理器);
}
@凌驾
受保护的布尔值shouldRenderAsCluster(群集){
//如果两个或多个项目重叠,则启动群集
返回cluster.getSize()>=Constants.MINIMUM\u cluster\u SIZE;
}
@凌驾
在呈现前ClusterItem(T项,
标记选项(标记选项){
ClusterMarkerItem-markerItem=(ClusterMarkerItem)项;
icon(markerItem.getmBitmapDescriptor());
}  
@凌驾
在呈现群集之前受保护的void(群集群集、标记选项标记选项){
//用于动态更改自定义地图标记
BitmapDescriptor descriptor=BitmapDescriptorFactory.fromResource(R.drawable.pin_集群);
标记选项。图标(描述符);
}
@凌驾
受保护的void onClusterRendered(群集、标记){
super.onClusterRendered(集群、标记);
//将信息窗口添加到集群图标
marker.setTitle(“计数”);
marker.setSnippet(“总计数-”+cluster.getItems().size());
}
}
您已经看过了吗?