Group layers

View inJavaKotlin
View on GitHub
Sample viewer app

Group a collection of layers together and toggle their visibility as a group.

Image of group layers

Use case

Group layers communicate to the user that layers are related and can be managed together.

In a land development project, you might group layers according to the phase of development.

How to use the sample

The layers in the map will be displayed in a table of contents. Toggle the checkbox next to a layer's name to change its visibility. Turning a group layer's visibility off will override the visibility of its child layers.

How it works

  1. Create an empty GroupLayer.
  2. Add a child layer to the group layer's layers collection.
  3. Set the group layer's GroupVisibilityMode to change its behavior:
  4. GroupVisibilityMode.INDEPENDENT allows each sublayer to change its visibility independently.
  5. GroupVisibilityMode.EXCLUSIVE allows only one sublayer to be visible at a time.
  6. GroupVisibilityMode.INHERITED treats the group layer as if it is one merged layer.
  7. To toggle the visibility of the group, simply change the group layer's visibility property.

Relevant API

  • GroupLayer

Additional information

The full extent of a group layer may change when child layers are added/removed. Group layers do not have a spatial reference, but the full extent will have the spatial reference of the first child layer.

Group layers can be saved to web scenes. In web maps, group layers will be ignored.


group layer, layers

Sample Code
 * Copyright 2019 Esri
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * See the License for the specific language governing permissions and
 * limitations under the License.

package com.esri.arcgisruntime.sample.grouplayers;

import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.MotionEvent;

public class BottomSheetRecyclerView extends RecyclerView {

  public BottomSheetRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);

  public BottomSheetRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

   * Intercept touch events and determine if {@link RecyclerView} should grab touch event to allow scrolling of RecyclerView
   * within Bottom Sheet
   * @param e event intercepted
   * @return return true to consume the event, false otherwise
  @Override public boolean onInterceptTouchEvent(MotionEvent e) {
    if (e.getAction() == MotionEvent.ACTION_SCROLL && canScrollVertically(1)) {
      return true;
    return super.onInterceptTouchEvent(e);