Cómo ocultar / mostrar grupos de marcadores por categoría con Google Maps en Android?

Estoy buscando hacer algo como lo que se hace aquí en Android. Lo que necesito hacer es marcar grupos en diferentes grupos y tener casillas de verificación para cada grupo.

Cuando se marca y desmarca en las casillas de verificación los marcadores deben mostrar y ocultar.

Aquí está mi archivo de MapsActivity.java.

public class MapsActivity extends FragmentActivity { //Restaurants private final LatLng LOCATION_DINEMORE = new LatLng(6.9270786,79.861243); private final LatLng LOCATION_BARISTA = new LatLng(6.0334009,80.218384); //Hotels private final LatLng LOCATION_AVENRA = new LatLng(7.211111,79.838610); private final LatLng LOCATION_MOUNTBATTEN = new LatLng(7.296411,80.635012); private GoogleMap mMap; // Might be null if Google Play services APK is not available. @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maps); setUpMapIfNeeded(); // Give text to buttons Button buttonloc1 = (Button)findViewById(R.id.btnLoc1); buttonloc1.setText("Dinemore"); Button buttonloc2 = (Button)findViewById(R.id.btnLoc2); buttonloc2.setText("Barista"); Button buttoncity = (Button)findViewById(R.id.btnCity); buttoncity.setText("My Location"); Button buttonremove = (Button)findViewById(R.id.removeMarker); buttonremove.setText("Remove"); /* Location myLocation = mMap.getMyLocation(); mMap.addMarker(new MarkerOptions() .position(new LatLng(myLocation.getLatitude(), myLocation.getLongitude())) .title("Hi I'm Here..:D") );*/ // Marker to Dinemore mMap.addMarker(new MarkerOptions() .position(LOCATION_DINEMORE) .title("Dinemore") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE)) ); // Marker to Barista mMap.addMarker(new MarkerOptions() .position(LOCATION_BARISTA) .title("Barista Lavazza") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE)) ); // Marker to Avenra Garden Hotel mMap.addMarker(new MarkerOptions() .position(LOCATION_AVENRA) .title("Avenra Garden") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW)) ); // Marker to Mounbatten Bunglow mMap.addMarker(new MarkerOptions() .position(LOCATION_MOUNTBATTEN) .title("Mounbatten Bunglow") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW)) ); //When touch again on the map marker title will hide mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() { @Override public void onInfoWindowClick(Marker marker) { } }); ArrayList<Marker> category1=new ArrayList<>(); ArrayList<Marker> category2=new ArrayList<>(); for (int i=0; i< category1.size(); i++){ category1.get(i).remove(); } } @Override protected void onResume() { super.onResume(); setUpMapIfNeeded(); } public void onClick_City(View v){ mMap.setMyLocationEnabled(true); } // When click on this button, Map shows the place of Dinemore public void onClick_Loc1(View v) { mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); CameraUpdate update = CameraUpdateFactory.newLatLngZoom(LOCATION_DINEMORE,10); mMap.animateCamera(update); } // When click on this button, Map shows the place of Barista public void onClick_Loc2(View v) { mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); CameraUpdate update = CameraUpdateFactory.newLatLngZoom(LOCATION_BARISTA,10); mMap.animateCamera(update); } // To rmove All the Markers public void onClick_Remove(View v){ mMap.clear(); } private void setUpMapIfNeeded() { // Do a null check to confirm that we have not already instantiated the map. if (mMap == null) { // Try to obtain the map from the SupportMapFragment. mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) .getMap(); // Check if we were successful in obtaining the map. if (mMap != null) { setUpMap(); } } } /** * This is where we can add markers or lines, add listeners or move the camera. In this case, we * just add a marker near Africa. * <p/> * This should only be called once and when we are sure that {@link #mMap} is not null. */ private void setUpMap() { mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker")); } 

}

Aquí está mi archivo activity_maps.xml.

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="10dip" android:paddingLeft="10dip" android:paddingRight="10dip" android:paddingTop="10dip" tools:context=".MapsActivity"> <Button android:id="@+id/btnLoc1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/btnCity" android:layout_alignParentTop="true" android:onClick="onClick_Loc1"/> <fragment android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_below="@+id/btnLoc1" android:layout_width="match_parent" android:layout_height="match_parent" /> <Button android:id="@+id/btnCity" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/btnLoc2" android:layout_alignParentTop="true" android:onClick="onClick_City"/> <Button android:id="@+id/btnLoc2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:onClick="onClick_Loc2"/> <Button android:id="@+id/removeMarker" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:onClick="onClick_Remove"/> <CheckBox android:id="@+id/checkbox_restaurant" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/btnLoc1" android:text="Restaurants" android:onClick="onCheckboxClicked"/> <CheckBox android:id="@+id/checkbox_hotels" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/checkbox_restaurant" android:text="Hotels" android:onClick="onCheckboxClicked"/> 

¿Cómo hago esto?

Gracias por adelantado.

Hay algunos problemas ocultos aquí. Necesita separar las diferentes tareas:

  1. Añadir marcadores de restaurante en el restaurante
  2. Quitar los marcadores de restaurante en el restaurante
  3. Añadir marcadores de barras en la barra de verificación
  4. Eliminar los marcadores de barra en la barra de desmarque

Usted tendrá que mantener una lista de restaurantes y bares, una base de datos SQLite con una mesa para restaurantes y una mesa para bares sería una buena opción.

Puede consultar la base de datos y rellenar una lista de objetos POJO y utilizar esas listas para generar los marcadores cuando se seleccionan las casillas de verificación.

A continuación, debe mantener una lista separada de los marcadores, de modo que cuando se desmarcan las casillas de verificación, puede quitar los marcadores del mapa.

Aquí está un ejemplo simple que junté rápidamente con valores codificados duros, usted necesitará agregar la pieza de la base de datos más adelante.

 public class CheckMapActivity extends AppCompatActivity implements OnMapReadyCallback { GoogleMap googleMap; List<MapLocation> restaurantList; List<MapLocation> barList; List<Marker> restaurantMarkers = new ArrayList<>(); List<Marker> barMarkers = new ArrayList<>(); @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_check_map); //Eventually load from a database //Hard coded here for now restaurantList = new ArrayList<>(); barList = new ArrayList<>(); MapLocation r1 = new MapLocation(37.78344,-122.42578, "Restaurant One" ); MapLocation r2 = new MapLocation(37.7876965,-122.4106738, "Restaurant Two" ); restaurantList.add(r1); restaurantList.add(r2); MapLocation b1 = new MapLocation(37.7866028,-122.4044511, "Bar One" ); MapLocation b2 = new MapLocation(37.7864459,-122.4090323, "Bar Two" ); barList.add(b1); barList.add(b2); CheckBox checkRestaurants = (CheckBox) findViewById(R.id.checkRestaurants); checkRestaurants.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if (b){ showRestaurants(); } else { hideRestaurants(); } } }); CheckBox checBars = (CheckBox) findViewById(R.id.checkBars); checBars.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if (b) { showBars(); } else { hideBars(); } } }); } @Override protected void onResume() { super.onResume(); SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); } @Override public void onMapReady(GoogleMap map) { googleMap = map; setUpMap(); } public void setUpMap() { googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); googleMap.setMyLocationEnabled(true); googleMap.getUiSettings().setZoomControlsEnabled(true); } public void showRestaurants() { restaurantMarkers.clear(); for (MapLocation loc : restaurantList){ Marker marker = googleMap.addMarker(new MarkerOptions() .position(new LatLng(loc.lat, loc.lon)) .title(loc.title) .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA))); CameraPosition cameraPosition = new CameraPosition.Builder() .target(new LatLng(loc.lat, loc.lon)).zoom(12).build(); googleMap.animateCamera(CameraUpdateFactory .newCameraPosition(cameraPosition)); restaurantMarkers.add(marker); } } public void showBars() { barMarkers.clear(); for (MapLocation loc : barList){ Marker marker = googleMap.addMarker(new MarkerOptions() .position(new LatLng(loc.lat, loc.lon)) .title(loc.title) .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))); CameraPosition cameraPosition = new CameraPosition.Builder() .target(new LatLng(loc.lat, loc.lon)).zoom(12).build(); googleMap.animateCamera(CameraUpdateFactory .newCameraPosition(cameraPosition)); barMarkers.add(marker); } } public void hideRestaurants(){ for (Marker marker : restaurantMarkers){ marker.remove(); } } public void hideBars(){ for (Marker marker : barMarkers){ marker.remove(); } } //POJO to hold locations: public class MapLocation { public MapLocation(double lt, double ln, String t){ lat = lt; lon = ln; title = t; } public double lat; public double lon; public String title; } } 

Aquí está el diseño, activity_check_map.xml:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.daniel.tabstest.CheckMapActivity"> <fragment android:id="@+id/map" class="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="500dp"/> <LinearLayout android:layout_alignBottom="@+id/map" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="vertical"> <CheckBox android:id="@+id/checkRestaurants" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Restaurants" /> <CheckBox android:id="@+id/checkBars" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Bars" /> </LinearLayout> </RelativeLayout> 

Resultado:

Restaurantes chequeados:

introduzca la descripción de la imagen aquí

Restaurantes y Bares chequeados:

introduzca la descripción de la imagen aquí

Bares chequeados:

introduzca la descripción de la imagen aquí

Nada comprobado:

introduzca la descripción de la imagen aquí

Consulte esto: https://stackoverflow.com/a/14508886/3134215

puede usar marker.setVisible() para mostrar / ocultar los marcadores.

Usted tiene que tomar la lista de la matriz de marcador depende de la categoría,

  ArrayList<Marker> category1=new ArrayList<>(); ArrayList<Marker> category2=new ArrayList<>(); 

que añadir su fabricante en esta lista de matrices, después de eliminar en el evento de clic plz escribir esto

 for (int i=0; i< category1.size(); i++){ category1.get(i).setVisibility(false); } 

creo que esto es útil

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.