2015-01-02 32 views
6

ho avuto questa attività:Come aggiungere titolo, snippet e icona a ClusterItem?

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

che ho cambiato nel seguente modo per utilizzare i marcatori di clustering:

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

Ora non so come aggiungere il titolo, snippet e icona per ogni marcatore come il codice precedente. Ora se clicco su un singolo marker non succede niente ... Come ottenerlo?

risposta

39

Qui si dovrebbe lavorare con ClusterManager stesso. Ad esempio, impostando il punto di cluster clicca:

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

E ci sono altri metodi diversi in classe ClusterManager. Avrete bisogno di un codice di meno evidente per assegnare finestra per marcatore o un cluster - si dovrebbe usare questo codice:

mClusterManager.getMarkerCollection().setOnInfoWindowAdapter(new MarkerInfoWindowAdapter()); 
mClusterManager.getClusterMarkerCollection().setOnInfoWindowAdapter(new ClusterInfoWindow()); 

Ci MarkerInfoWindowAdapter e ClusterWindowAdapter è vostre classi, che implementa GoogleMap.InfoWindowAdapter.

Con le icone è un po 'più difficile, perché il clustering cambia le icone di default. È necessario utilizzare il metodo:

public void setRenderer(com.google.maps.android.clustering.view.ClusterRenderer<T> view) 

Si potrebbe classificare il proprio programma di rendering e sovrascrivere alcuni metodi. Ad esempio, per impostare icone personalizzate utilizzano tale classe:

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

e utilizzarlo in modo tale:

mClusterManager.setRenderer(new OwnIconRendered(activity.getApplicationContext(), getMap(), mClusterManager)); 
+0

Nevermind su un'icona. Avete alcuni esempi che mostrano come aggiungere il titolo e lo snippet ai marcatori che si trovano all'interno dei cluster? – smartmouse

+2

È possibile aggiungere il titolo e lo snippet come l'icona - nel metodo onBeforeClusterRendered (vedere la risposta) utilizzare i metodi title (String title) e snippet (String snippet) dell'oggetto markerOptions. –

+0

Ha funzionato, grazie. – smartmouse