【发布时间】:2014-06-06 04:56:45
【问题描述】:
我正在尝试使用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;
}
});
在这里我将标记添加到集群管理器:
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);
}
}
InfoWindow 的布局还可以,但内容为空,因为 clickedClusterItem 和 clickedCluster 始终为空...
关于我可能做错了什么的任何提示?
我看到了一些其他答案,涉及使用标记和相应对象创建地图,但我不太确定该怎么做。
【问题讨论】:
-
你用了什么集群库?
-
直接来自我的 build.gradle 文件:
compile 'com.google.maps.android:android-maps-utils:0.2+'
标签: android google-maps google-maps-api-3 markerclusterer