Android 使用Google Map utils中的Map Cluster按下标记后,信息窗口中的自定义信息

Android 使用Google Map utils中的Map Cluster按下标记后,信息窗口中的自定义信息,android,google-maps,google-maps-api-3,markerclusterer,Android,Google Maps,Google Maps Api 3,Markerclusterer,我正在尝试使用MarkerCluster 这就是我所尝试的: private final GoogleMap.InfoWindowAdapter mInfoWindowAdapter = new GoogleMap.InfoWindowAdapter() { @Override public View getInfoWindow(Marker marker) { View window = null; if(getA

我正在尝试使用
MarkerCluster

这就是我所尝试的:

private final GoogleMap.InfoWindowAdapter mInfoWindowAdapter = new GoogleMap.InfoWindowAdapter() {
        @Override
        public View getInfoWindow(Marker marker) {
            View window = null;
            if(getActivity()!=null&&isAdded()){
                window = getActivity().getLayoutInflater().inflate(R.layout.map_objective_overlay, null);
                final CustomFontTextView nameTV = (CustomFontTextView) window.findViewById(R.id.nameTV);

                if(clickedClusterItem!=null){
                    System.out.println("You clicked this: "+clickedClusterItem.getName());
                }else{
                    System.out.println("The clicked cluster item was nulllll");
                }
                if (clickedCluster != null) {
                    for (Objective item : clickedCluster.getItems()) {
                        // Extract data from each item in the cluster as needed
                        if(item.getRemoteId().equals(clickedClusterItem.getRemoteId())){
                            nameTV.setText(clickedClusterItem.getName());
                        }
                    }
                }
            }
            return window;
        }

        @Override
        public View getInfoContents(Marker marker) {
            return null;
        }
    };
    private Objective clickedClusterItem;
    private Cluster<Objective> clickedCluster;

@Override
    public void onResume() {
        super.onResume();
        preferences = getActivity().getSharedPreferences(Constants.PREFS_NAME, Context.MODE_PRIVATE);
        if (map == null) {
            map = fragment.getMap();
            mClusterManager = new ClusterManager<Objective>(getActivity(), map);
            map.setOnCameraChangeListener(mClusterManager);
            map.setOnMarkerClickListener(mClusterManager);
            latitude = Double.parseDouble(preferences.getString(Constants.LATITUDE, "0"));
            longitude = Double.parseDouble(preferences.getString(Constants.LONGITUDE, "0"));
            map.addMarker(new MarkerOptions()
                    .position(new LatLng(latitude, longitude))
                    .title("Hello " + preferences.getString(Constants.TOURIST_NAME, "tourist"))
                    .snippet("You are here")
                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_check_in)));
            map.setInfoWindowAdapter(mClusterManager.getMarkerManager());
            //mClusterManager.setRenderer(new ObjectiveClusterRenderer(getActivity(), map, mClusterManager));
            mClusterManager.getClusterMarkerCollection().setOnInfoWindowAdapter(mInfoWindowAdapter);
            mClusterManager.getMarkerCollection().setOnInfoWindowAdapter(mInfoWindowAdapter);
            map.setOnMarkerClickListener(mClusterManager);

            mClusterManager.setOnClusterClickListener(new ClusterManager.OnClusterClickListener<Objective>() {
                @Override
                public boolean onClusterClick(Cluster<Objective> cluster) {
                    clickedCluster = cluster; // remember for use later in the Adapter
                    return false;
                }
            });
            mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<Objective>() {
                @Override
                public boolean onClusterItemClick(Objective item) {
                    clickedClusterItem = item;
                    return false;
                }
            });
private final GoogleMap.InfoWindowAdapter mInfoWindowAdapter=new GoogleMap.InfoWindowAdapter(){
@凌驾
公共视图getInfoWindow(标记器){
视图窗口=空;
如果(getActivity()!=null&&isAdded()){
window=getActivity().GetLayoutFlater().inflate(R.layout.map\u objective\u覆盖,空);
最终CustomFontTextView nameTV=(CustomFontTextView)window.findViewById(R.id.nameTV);
如果(clickedClusterItem!=null){
System.out.println(“您单击了它:+clickedClusterItem.getName());
}否则{
System.out.println(“单击的集群项为null”);
}
如果(clickedCluster!=null){
对于(目标项:clickedCluster.getItems()){
//根据需要从群集中的每个项目提取数据
if(item.getRemoteId().equals(clickedClusterItem.getRemoteId())){
nameTV.setText(clickedClusterItem.getName());
}
}
}
}
返回窗口;
}
@凌驾
公共视图getInfoContents(标记器){
返回null;
}
};
私人目标点击集群项目;
私有集群点击集群;
@凌驾
恢复时公开作废(){
super.onResume();
preferences=getActivity().GetSharedReferences(Constants.PREFS\u NAME,Context.MODE\u PRIVATE);
if(map==null){
map=fragment.getMap();
mClusterManager=newclustermanager(getActivity(),map);
map.SetonCamerachenglistener(McClusterManager);
setOnMarkerClickListener(mClusterManager);
latitude=Double.parseDouble(preferences.getString(Constants.latitude,“0”));
longitude=Double.parseDouble(preferences.getString(Constants.longitude,“0”));
addMarker(新的MarkerOptions()
.位置(新车床(纬度、经度))
.title(“Hello”+preferences.getString(Constants.tourism_NAME,“tourism”))
.snippet(“您在这里”)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_check_in));
setInfoWindowAdapter(mClusterManager.getMarkerManager());
//setRenderer(新的ObjectiveClusterRenderer(getActivity(),map,mClusterManager));
mClusterManager.getClusterMarkerCollection().setOnInfoWindowAdapter(mInfoWindowAdapter);
mClusterManager.getMarkerCollection().setOnInfoWindowAdapter(mInfoWindowAdapter);
setOnMarkerClickListener(mClusterManager);
mClusterManager.setOnClusterClickListener(新的ClusterManager.OnClusterClickListener(){
@凌驾
公共布尔onClusterClick(集群){
clickedCluster=cluster;//记住以后在适配器中使用
返回false;
}
});
mClusterManager.setOnClusterItemClickListener(新的ClusterManager.OnClusterItemClickListener(){
@凌驾
公共布尔onClusterItemClick(目标项){
单击ClusterItem=项目;
返回false;
}
});
在这里,我将标记添加到clustermanager:

public void setUpClusterer(List<Objective> objectivesList) {
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), 10));
        addItems(objectivesList);
    }

    private void addItems(List<Objective> objectiveList) {
        for (Objective anObjectiveList : objectiveList) {
            Objective offsetItem = new Objective();
            offsetItem.setRemoteId(anObjectiveList.getRemoteId());
            offsetItem.setName(anObjectiveList.getName());
            objectiveMap.put(offsetItem.getRemoteId(), offsetItem);
            System.out.println("This is the remote ID: " + offsetItem.getRemoteId());
            mClusterManager.addItem(offsetItem);
        }
    }
public void setupcluster(列表对象列表){
移动摄像头(CameraUpdateFactory.newLatLngZoom(新LatLng(纬度,经度),10));
附加项(目标列表);
}
私有无效附加项(列表objectiveList){
for(客观和客观主义者:客观主义者){
目标偏移项=新目标();
setRemoteId(anObjectiveList.getRemoteId());
setName(anObjectiveList.getName());
objectiveMap.put(offsetItem.getRemoteId(),offsetItem);
System.out.println(“这是远程ID:+offsetItem.getRemoteId());
mClusterManager.addItem(offsetItem);
}
}
InfoWindow
的布局正常,但内容为空,因为
clickedClusterItem
clickedClusterItem
始终为空

关于我可能做错了什么,有什么提示吗


我看到了一些其他的答案,包括创建带有标记和相应对象的地图,但我不太确定如何做到这一点。

我在我的应用程序中做到了这一点。请在您的应用程序中尝试

    GoogleMap googleMap;    
    Double latitude;
    Double longitude;    
    Marker mark;
    MarkerOptions marker;
    Bitmap bitmap;
    String position, catName, activity;
    ToggleButton listView, mapView;
    Hashtable<Integer, String> markers;

    ArrayList<HomeProperty> list = new ArrayList<HomeProperty>();
    ArrayList<HomeProperty> newList;
    ArrayList<HomeProperty> category = new ArrayList<HomeProperty>();
    ArrayList<SearchProperty> searchList = new ArrayList<SearchProperty>();
    ArrayList<HomeProperty> locationList = new ArrayList<HomeProperty>();

    ProgressDialog dialog;

    ImageLoader imageLoader;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        // Introduction
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map);
        initilizeMap();
        imageLoader = new ImageLoader(getApplicationContext());

        markers = new Hashtable<Integer, String>();

        listView = (ToggleButton) findViewById(R.id.listView);
        mapView = (ToggleButton) findViewById(R.id.mapView);
        listView.setOnCheckedChangeListener(this);
        mapView.setOnCheckedChangeListener(this);
        mapView.setChecked(true);

        // setting the arraylist containing all data of events
        ArrayData aData = (ArrayData) getIntent().getSerializableExtra("list");
        position = getIntent().getStringExtra("position");
        catName = getIntent().getStringExtra("catName");
        activity = getIntent().getStringExtra("activity");
        list = aData.getList();


        ArrayData categoryData = (ArrayData) getIntent().getSerializableExtra(
                "category");
        category = categoryData.getList();

        if (getIntent().hasExtra("searchData")) {
            SearchData search = (SearchData) getIntent().getSerializableExtra(
                    "searchData");
            searchList = search.getList();
        } else {
            searchList = new ArrayList<SearchProperty>();
        }

        newList = new ArrayList<HomeProperty>();
        // for all categories
        if (catName.equalsIgnoreCase("All")) {
            newList.clear();
            newList.addAll(list);

        } else if (activity.equals("search")) {
            newList.addAll(list);

        }
        // for single category
        else {
            for (int count = 0; count < list.size(); count++) {
                if (list.get(count).getCategoryName().equals(catName)) {
                    newList.add(list.get(count));
                }
            }
        }

        // looping through All Transactions
        for (int count = 0; count < newList.size(); count++) {
            HomeProperty prop = new HomeProperty(newList.get(count).getLatitude(),
                    newList.get(count).getLongitude());

            locationList.add(prop);
        }


        for (int count = 0; count < newList.size(); count++) {
            marker = new MarkerOptions()
                    .position(
                            new LatLng(Double.parseDouble(list.get(count)
                                    .getLatitude()), Double.parseDouble(newList
                                    .get(count).getLongitude())))
                    .title(newList.get(count).getTitle())
                    .snippet(
                            new JSONMethods().SHORTIMAGEURL
                                    + newList.get(count).getImageDirectory()
                                    + "/thumb_" + newList.get(count).getImage());

            googleMap.addMarker(marker);

            CameraPosition cameraPosition = new CameraPosition.Builder()
                    .target(new LatLng(Double.parseDouble(newList.get(count)
                            .getLatitude()), Double.parseDouble(newList.get(count)
                            .getLongitude()))).zoom(12).build();

            googleMap.animateCamera(CameraUpdateFactory
                    .newCameraPosition(cameraPosition));
            googleMap.setInfoWindowAdapter(new CustomInfoWindowAdapter());
        }


        googleMap.getUiSettings().setZoomGesturesEnabled(true);
        googleMap.getUiSettings().setCompassEnabled(true);
        googleMap.getUiSettings().setMyLocationButtonEnabled(true);
        googleMap.getUiSettings().setRotateGesturesEnabled(true);
    }

    // set action on home button click in action bar
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        // Handle action bar actions click
        switch (item.getItemId()) {
        // case R.id.action_settings:
        // return true;
        case android.R.id.home:
            finish();
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

    private class CustomInfoWindowAdapter implements InfoWindowAdapter {

        private View view;

        public CustomInfoWindowAdapter() {
            view = getLayoutInflater().inflate(R.layout.custominfowindow, null);

        }

        @Override
        public View getInfoContents(Marker mark) {

            if (MapActivity.this.mark != null
                    && MapActivity.this.mark.isInfoWindowShown()) {
                MapActivity.this.mark.showInfoWindow();
            }
            return view;
        }

        @Override
        public View getInfoWindow(final Marker mark) {
            MapActivity.this.mark = mark;

            final ImageView image = ((ImageView) view.findViewById(R.id.badge));

            imageLoader.DisplayImage(mark.getSnippet(), image);

            final String title = mark.getTitle();
            final TextView titleUi = ((TextView) view.findViewById(R.id.title));
            if (title != null) {
                titleUi.setText(title);
            } else {
                titleUi.setText("");
            }

            return view;
        }

    }
GoogleMap谷歌地图;
双纬度;
双经度;
标记;
标记选择标记;
位图;
字符串位置、catName、活动;
切换按钮列表视图、地图视图;
哈希表标记;
ArrayList=新建ArrayList();
ArrayList新列表;
ArrayList类别=新建ArrayList();
ArrayList searchList=新建ArrayList();
ArrayList locationList=新建ArrayList();
进程对话;
图像加载器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//导言
super.onCreate(savedInstanceState);
setContentView(R.layout.map);
initilizeMap();
imageLoader=新的imageLoader(getApplicationContext());
markers=新哈希表();
listView=(ToggleButton)findViewById(R.id.listView);
mapView=(切换按钮)findViewById(R.id.mapView);
setOnCheckedChangeListener(这个);
setOnCheckedChangeListener(这个);
mapView.setChecked(true);
//设置包含所有事件数据的arraylist
阿达塔=
public void initilizeMap() {
    googleMap = mFragment.getMap();
    googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
    googleMap.getUiSettings().setZoomControlsEnabled(true); // true to`enter code here`
    googleMap.getUiSettings().setZoomGesturesEnabled(true);
    googleMap.getUiSettings().setCompassEnabled(true);
    googleMap.getUiSettings().setMyLocationButtonEnabled(true);
    googleMap.getUiSettings().setRotateGesturesEnabled(true);
    if (googleMap == null) {
        Toast.makeText(getActivity(), "Sorry! unable to create maps",
                Toast.LENGTH_SHORT).show();
    }
    mClusterManager = new ClusterManager<MyItem>(getActivity(),   googleMap );
//          googleMap.setInfoWindowAdapter(new CustomInfoWindowAdapter());
    googleMap.setOnMapLoadedCallback(this);
    googleMap.setMyLocationEnabled(true);
    googleMap.setBuildingsEnabled(true);
    googleMap.getUiSettings().setTiltGesturesEnabled(true);

    MyItem offsetItem = new MyItem(Double.parseDouble(outletList.get(i).getMap_latitude()),
                                       Double.parseDouble(outletList.get(i).getMap_longitude()), title , address);
        mClusterManager.addItem(offsetItem);
        googleMap.setInfoWindowAdapter(new CustomInfoWindowAdapter(offsetItem));

}

private class CustomInfoWindowAdapter implements InfoWindowAdapter {
  Marker marker;
  private View view;
  private MyItem items;

  public CustomInfoWindowAdapter(MyItem item) {
    view = getActivity().getLayoutInflater().inflate(
        R.layout.custom_info_window, null);
    this.items = item;
  }

  @Override
  public View getInfoContents(Marker marker) {

    if (marker != null && marker.isInfoWindowShown()) {
      marker.hideInfoWindow();
      marker.showInfoWindow();
    }
    return null;
  }

  @Override
  public View getInfoWindow(final Marker marker) {
    this.marker = marker;

    String url = null;

    if (marker.getId() != null && markers != null && markers.size() > 0) {
      if (markers.get(marker.getId()) != null
          && markers.get(marker.getId()) != null) {
        url = markers.get(marker.getId());
      }
    }

    final ImageView image = ((ImageView) view.findViewById(R.id.badge));

    if (url != null && !url.equalsIgnoreCase("null")
        && !url.equalsIgnoreCase("")) {
      imageLoader.displayImage(url, image, options,
          new SimpleImageLoadingListener() {
            @Override
            public void onLoadingComplete(String imageUri, View view,
                Bitmap loadedImage) {
              super.onLoadingComplete(imageUri, view, loadedImage);
              getInfoContents(marker);
            }
          });
    } else {
      image.setImageResource(R.drawable.ic_launcher);
    }

    final String title = items.getTitle();
    Log.e(TAG, "TITLE : " + title);
    final TextView titleUi = ((TextView) view.findViewById(R.id.title));
    if (title != null) {
      titleUi.setText(title);
    } else {
      titleUi.setText("");
    }

    final String address = items.getAddress();
    final TextView snippetUi = ((TextView) view.findViewById(R.id.snippet));
    if (address != null) {
      snippetUi.setText(address);
    } else {
      snippetUi.setText("");
    }
  }
}