Sto utilizzando l'Utilità di cluster di Marker di Google Maps Android da here e sto aggiungendo un gruppo di elementi (circa 700) da un elenco che ricevo dal mio server. Ho appianato i miei bug iniziali e riesco a vedere i cluster, quindi a ingrandirli e vederli declinare in singoli marker. Tuttavia, ci sono un paio di elementi che sono distanti da tutti gli altri, in modo che anche alla massima riduzione, non sarebbero mai raggruppati. Per qualche motivo, questi elementi non vengono visualizzati sulla mia mappa - non quando eseguo lo zoom in avanti, non quando faccio lo zoom indietro.Mappe Android ClusteredMarkers - non mostrare non in elenco?
Ho controllato le coordinate, sono reali, e prima di iniziare a utilizzare il clustering ho potuto vedere questi elementi senza problemi, quindi presumo di aver fatto qualcosa di sbagliato nel mio codice di clustering.
Ecco il codice:
private void setUpClusterer() {
// Initialize the manager with the context and the map
mClusterManager = new ClusterManager<>(getActivity(), map);
vendorRenderer = new VendorRenderer();
mClusterManager.setRenderer(vendorRenderer);
mClusterManager.setOnClusterClickListener(this);
mClusterManager.setOnClusterItemClickListener(this);
//point the maps listeners at the listeners implemented by the cluster manager
map.setOnCameraChangeListener(mClusterManager);
map.setOnMarkerClickListener(mClusterManager);
//add items to the cluster manager
addClusterItems(-1);
mClusterManager.cluster();
}
private void addClusterItems(int positionToMark) {
if (null == list) {
return;
}
LatLng position;
int maxMarkers = Math.min(list.size(), getResources().getInteger(R.integer.number_of_results_on_map));
mClusterManager.clearItems();
for (int i = 0; i < maxMarkers; i++) {
vendorItem = list.get(i);
if (vendorItem.getAddress().contains("Remote 1")) {
Log.e("Kibi", "Adding Remote 1, pos = " + i);
Log.e("Kibi", "Coordinates =" + vendorItem.getPointCoordinates().toString());
}
if (vendorItem.getAddress().contains("Clustered 1")) {
Log.e("Kibi", "Adding Clustered 1, pos = " + i);
Log.e("Kibi", "Coordinates =" + vendorItem.getPointCoordinates().toString());
}
if (vendorItem.getAddress().contains("Remote 2")) {
Log.e("Kibi", "Adding Remote 2, pos = " + i);
Log.e("Kibi", "Coordinates =" + vendorItem.getPointCoordinates().toString());
}
VendorMapItem item = new VendorMapItem(vendorItem.getPointCoordinates(),
"Some other text");
if (i == positionToMark) {
selectedItem = item;
}
mClusterManager.addItem(item);
}
if (-1 == positionToMark) {
selectedItem = null;
}
}
Questo dimostra le voci sempre aggiunti - I registri ho aggiunto aiutarmi a vedere che i miei 2 oggetti remoti vengono aggiunti con buone coordinate, e sono simili (anche se lontano da) mio articolo cluster selezionato (che si vede)
Ecco il codice di rendering:
/* This draws the markers for us */
private class VendorRenderer extends DefaultClusterRenderer<VendorMapItem> {
Context context = getActivity().getApplicationContext();
public final IconGenerator mIconGenerator = new IconGenerator(context);
public final IconGenerator mSelectedIconGenerator = new IconGenerator(context);
private final View mItemView;
private final View mSelectedItemView;
public VendorRenderer() {
super(getActivity().getApplicationContext(), map, mClusterManager);
// Create selected custom Marker
RelativeLayout selectedContainer = (RelativeLayout) view.findViewById(R.id.marker_map_selected_container);
mSelectedItemView = ((LayoutInflater) getActivity().getSystemService
(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.map_marker_selected_layout, selectedContainer, false);
mSelectedIconGenerator.setContentView(mSelectedItemView);
mSelectedIconGenerator.setBackground(null);
// Create custom Marker
LinearLayout container = (LinearLayout) view.findViewById(R.id.text_marker_map_container);
mItemView = ((LayoutInflater) getActivity().getSystemService
(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.map_marker_layout, container, true);
mIconGenerator.setContentView(mItemView);
mIconGenerator.setBackground(null);
}
@Override
protected void onBeforeClusterItemRendered(VendorMapItem vendor, MarkerOptions markerOptions) {
// Draw a single vendor.
Bitmap icon;
if (null == selectedItem || !vendor.getPosition().equals(selectedItem.getPosition()))
{
icon = mIconGenerator.makeIcon();
} else {
icon = mSelectedIconGenerator.makeIcon();
}
markerOptions.title(vendor.getTitle());
markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
}
@Override
protected void onBeforeClusterRendered(Cluster<VendorMapItem> cluster, MarkerOptions markerOptions) {
// Draw multiple vendors clustered...
Bitmap icon = mIconGenerator.makeIcon();
markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
}
@Override
protected boolean shouldRenderAsCluster(Cluster cluster) {
// Always render clusters.
return cluster.getSize() > 1;
}
}
In generale gli elementi cluster sono mostrati, e quelle anche declustered, se sel ect o non Ho un'altra vista che mostra tutti i dati di posizione in un elenco e le mie posizioni remote mostrano solo pinne lì.
Qualche idea su cosa sto facendo male?
È possibile utilizzare per aggiungere il cluster sulla mappa –
Grazie a @Pratik, ma esiste già un meccanismo per i cluster nella sorgente che sto utilizzando. Semplicemente non disegna i singoli elementi NON in cluster quando non vengono mai raggruppati e non riesco a capire perché. – Kibi