2015-01-02 13 views
6

Ich hatte diese Aktivität:Wie fügt man ClusterItem Titel, Snippet und Icon hinzu?

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

, die ich in der folgenden Art und Weise geändert Marker Clustering zu verwenden:

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

Nun weiß ich nicht, wie man Titel hinzuzufügen, Schnipsel und Symbol für jeden Marker wie vorheriger Code. Wenn ich nun auf einen einzelnen Marker klicke, passiert nichts ... Wie bekomme ich das?

Antwort

39

Hier sollten Sie mit dem ClusterManager selbst arbeiten. Zum Beispiel Einstellung auf Cluster-Elemente klicken:

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

Und es gibt andere verschiedene Methoden in ClusterManager Klasse. Sie benötigen einen weniger offensichtlichen Code Infofenster Marker oder Cluster zuweisen - Sie diesen Code verwenden sollen:

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

Es MarkerInfoWindowAdapter und ClusterWindowAdapter ist Ihre Klassen, der GoogleMap.InfoWindowAdapter implementiert.

Mit Symbolen ist es ein wenig schwieriger, weil Clustering Icons auf Standardwerte ändert. Sie sollten Methode verwenden:

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

Sie könnten Ihre eigenen Renderer Klasse und einige Methoden außer Kraft setzen. Zum Beispiel setzen benutzerdefinierte Symbole, eine solche Klasse zu verwenden:

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

Und verwenden Sie es in einer solchen Art und Weise:

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

Nevermind über Symbol. Haben Sie einige Beispiele, die zeigen, wie Titel und Snippets zu Markern innerhalb von Clustern hinzugefügt werden? – smartmouse

+2

Sie können Titel und Snippet auf die gleiche Weise hinzufügen wie in der Methode onBeefeClusterRendered (siehe Antwort), verwenden Sie Methoden title (String title) und snippet (String snippet) des markerOptions-Objekts. –

+0

Arbeitete, danke. – smartmouse