Android app with several checkbox areas












0














My app is several checkboxes areas. On some event data from all checkboxes will be saved/sent/etc.



All is working, but this Activity is loading about 7 seconds because my code is bad, so I need help in refactoring and optimize it.



How it looks in the app:




enter image description here







enter image description here




I have 10 forms with ~ 100 checkboxes summary. To draw it, I'm using 10 recyclers with 10 adapters. Every adapter initialize with his own list and have own layout manager.



How can I make this code good?



I can't pass all code, it's too large, so I give it apart.



To draw one recycler I use it (variable names changed):



//toolbar and questform
...
<RelativeLayout android:id="@+id/rv_wrapper1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/padding_default">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:text="@string/title1"
android:textSize="@dimen/text_size_big" />

<ImageView
android:id="@+id/img_arrow_1"
android:layout_width="@dimen/image_size_small"
android:layout_height="@dimen/image_size_small"
android:layout_alignParentRight="true"
android:layout_marginEnd="@dimen/margin_default"
android:layout_marginRight="@dimen/margin_default"
android:src="@drawable/ic_expand" />


<com.github.chuross.library.ExpandableLayout
android:id="@+id/rv_expaner1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/img_arrow_1"
app:exl_duration="1000">

<android.support.v7.widget.RecyclerView
android:id="@+id/rv_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/padding_small">
</android.support.v7.widget.RecyclerView>
</com.github.chuross.library.ExpandableLayout>
</RelativeLayout>
///another recycles


and I duplicate it 9 times on XML.



Activity



RecyclerView rv1 = findViewById(R.id.rv1);
RecyclerView rv2 = findViewById(R.id.rv2);
//another 8 RV.
...

rv1Adapter = new RVAdapter(this, initializList1(this));
rv2Adapter = new RVAdapter(this, initializList2(this));
//another 8 adapters
...

rv1.setAdapter(rv1Adapter);
rv2.setAdapter(rv2Adapter);
...
//another 8 setters

RecyclerView.LayoutManager layoutManagerForRv1 = new GridLayoutManager(this, 3);
RecyclerView.LayoutManager layoutManagerForRv2 = new GridLayoutManager(this, 3);
...
//another 8 managers

rv1.setLayoutManager(layoutManagerForRv1);
rv2.setLayoutManager(layoutManagerForRv2);
...
//another 8 setters for managers

RelativeLayout rv1Expander = findViewById(R.id.rv_expander1);
RelativeLayout rv2Expander = findViewById(R.id.rv_expander2);
...
//another 8 RL

rv1Expander.setOnClickListener(new ExpanderLayoutHelper(R.id.rv_expander1));
rv2Expander.setOnClickListener(new ExpanderLayoutHelper(R.id.rv_expander2));
...
//another 8 listeners


ExpanderLayoutHelper - using for expand/collapse animation of RV:



public class ExpanderLayoutHelper implements View.OnClickListener {
RelativeLayout expandWrapper;
ImageView arrow;
ExpandableLayout expandableLayout;

ExpanderLayoutHelper(int relativeLayoutId) {
this.expandWrapper = findViewById(relativeLayoutId);
this.arrow = (ImageView) expandWrapper.getChildAt(1);
this.expandableLayout = (ExpandableLayout) expandWrapper.getChildAt(2);
}

@Override
public void onClick(View v) {
if (expandableLayout.isCollapsed()) {
expandableLayout.expand();
expandWrapper.getChildAt(1).animate().rotation(90f).setDuration(1000);
} else {
expandableLayout.collapse();
arrow.animate().rotation(0).setDuration(1000);
}
}
}


Other points will be here if i remember something important.




  1. initializeList() is just 1-20 list.add("something") operation. For every form I have unique lists, so I have 10 initialize methods now.


  2. When I draw 10 recyclers without adapters lists initialization, the app is not lagging. So, it lags about lines adapter = new RVAdapter(this, initialize(this));. I know I can try to solve it with multithread, but bad code and XML is not gone.











share|improve this question





























    0














    My app is several checkboxes areas. On some event data from all checkboxes will be saved/sent/etc.



    All is working, but this Activity is loading about 7 seconds because my code is bad, so I need help in refactoring and optimize it.



    How it looks in the app:




    enter image description here







    enter image description here




    I have 10 forms with ~ 100 checkboxes summary. To draw it, I'm using 10 recyclers with 10 adapters. Every adapter initialize with his own list and have own layout manager.



    How can I make this code good?



    I can't pass all code, it's too large, so I give it apart.



    To draw one recycler I use it (variable names changed):



    //toolbar and questform
    ...
    <RelativeLayout android:id="@+id/rv_wrapper1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="@dimen/padding_default">

    <TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_alignParentLeft="true"
    android:text="@string/title1"
    android:textSize="@dimen/text_size_big" />

    <ImageView
    android:id="@+id/img_arrow_1"
    android:layout_width="@dimen/image_size_small"
    android:layout_height="@dimen/image_size_small"
    android:layout_alignParentRight="true"
    android:layout_marginEnd="@dimen/margin_default"
    android:layout_marginRight="@dimen/margin_default"
    android:src="@drawable/ic_expand" />


    <com.github.chuross.library.ExpandableLayout
    android:id="@+id/rv_expaner1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/img_arrow_1"
    app:exl_duration="1000">

    <android.support.v7.widget.RecyclerView
    android:id="@+id/rv_1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="@dimen/padding_small">
    </android.support.v7.widget.RecyclerView>
    </com.github.chuross.library.ExpandableLayout>
    </RelativeLayout>
    ///another recycles


    and I duplicate it 9 times on XML.



    Activity



    RecyclerView rv1 = findViewById(R.id.rv1);
    RecyclerView rv2 = findViewById(R.id.rv2);
    //another 8 RV.
    ...

    rv1Adapter = new RVAdapter(this, initializList1(this));
    rv2Adapter = new RVAdapter(this, initializList2(this));
    //another 8 adapters
    ...

    rv1.setAdapter(rv1Adapter);
    rv2.setAdapter(rv2Adapter);
    ...
    //another 8 setters

    RecyclerView.LayoutManager layoutManagerForRv1 = new GridLayoutManager(this, 3);
    RecyclerView.LayoutManager layoutManagerForRv2 = new GridLayoutManager(this, 3);
    ...
    //another 8 managers

    rv1.setLayoutManager(layoutManagerForRv1);
    rv2.setLayoutManager(layoutManagerForRv2);
    ...
    //another 8 setters for managers

    RelativeLayout rv1Expander = findViewById(R.id.rv_expander1);
    RelativeLayout rv2Expander = findViewById(R.id.rv_expander2);
    ...
    //another 8 RL

    rv1Expander.setOnClickListener(new ExpanderLayoutHelper(R.id.rv_expander1));
    rv2Expander.setOnClickListener(new ExpanderLayoutHelper(R.id.rv_expander2));
    ...
    //another 8 listeners


    ExpanderLayoutHelper - using for expand/collapse animation of RV:



    public class ExpanderLayoutHelper implements View.OnClickListener {
    RelativeLayout expandWrapper;
    ImageView arrow;
    ExpandableLayout expandableLayout;

    ExpanderLayoutHelper(int relativeLayoutId) {
    this.expandWrapper = findViewById(relativeLayoutId);
    this.arrow = (ImageView) expandWrapper.getChildAt(1);
    this.expandableLayout = (ExpandableLayout) expandWrapper.getChildAt(2);
    }

    @Override
    public void onClick(View v) {
    if (expandableLayout.isCollapsed()) {
    expandableLayout.expand();
    expandWrapper.getChildAt(1).animate().rotation(90f).setDuration(1000);
    } else {
    expandableLayout.collapse();
    arrow.animate().rotation(0).setDuration(1000);
    }
    }
    }


    Other points will be here if i remember something important.




    1. initializeList() is just 1-20 list.add("something") operation. For every form I have unique lists, so I have 10 initialize methods now.


    2. When I draw 10 recyclers without adapters lists initialization, the app is not lagging. So, it lags about lines adapter = new RVAdapter(this, initialize(this));. I know I can try to solve it with multithread, but bad code and XML is not gone.











    share|improve this question



























      0












      0








      0







      My app is several checkboxes areas. On some event data from all checkboxes will be saved/sent/etc.



      All is working, but this Activity is loading about 7 seconds because my code is bad, so I need help in refactoring and optimize it.



      How it looks in the app:




      enter image description here







      enter image description here




      I have 10 forms with ~ 100 checkboxes summary. To draw it, I'm using 10 recyclers with 10 adapters. Every adapter initialize with his own list and have own layout manager.



      How can I make this code good?



      I can't pass all code, it's too large, so I give it apart.



      To draw one recycler I use it (variable names changed):



      //toolbar and questform
      ...
      <RelativeLayout android:id="@+id/rv_wrapper1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:padding="@dimen/padding_default">

      <TextView
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_alignParentStart="true"
      android:layout_alignParentLeft="true"
      android:text="@string/title1"
      android:textSize="@dimen/text_size_big" />

      <ImageView
      android:id="@+id/img_arrow_1"
      android:layout_width="@dimen/image_size_small"
      android:layout_height="@dimen/image_size_small"
      android:layout_alignParentRight="true"
      android:layout_marginEnd="@dimen/margin_default"
      android:layout_marginRight="@dimen/margin_default"
      android:src="@drawable/ic_expand" />


      <com.github.chuross.library.ExpandableLayout
      android:id="@+id/rv_expaner1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_below="@id/img_arrow_1"
      app:exl_duration="1000">

      <android.support.v7.widget.RecyclerView
      android:id="@+id/rv_1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_marginTop="@dimen/padding_small">
      </android.support.v7.widget.RecyclerView>
      </com.github.chuross.library.ExpandableLayout>
      </RelativeLayout>
      ///another recycles


      and I duplicate it 9 times on XML.



      Activity



      RecyclerView rv1 = findViewById(R.id.rv1);
      RecyclerView rv2 = findViewById(R.id.rv2);
      //another 8 RV.
      ...

      rv1Adapter = new RVAdapter(this, initializList1(this));
      rv2Adapter = new RVAdapter(this, initializList2(this));
      //another 8 adapters
      ...

      rv1.setAdapter(rv1Adapter);
      rv2.setAdapter(rv2Adapter);
      ...
      //another 8 setters

      RecyclerView.LayoutManager layoutManagerForRv1 = new GridLayoutManager(this, 3);
      RecyclerView.LayoutManager layoutManagerForRv2 = new GridLayoutManager(this, 3);
      ...
      //another 8 managers

      rv1.setLayoutManager(layoutManagerForRv1);
      rv2.setLayoutManager(layoutManagerForRv2);
      ...
      //another 8 setters for managers

      RelativeLayout rv1Expander = findViewById(R.id.rv_expander1);
      RelativeLayout rv2Expander = findViewById(R.id.rv_expander2);
      ...
      //another 8 RL

      rv1Expander.setOnClickListener(new ExpanderLayoutHelper(R.id.rv_expander1));
      rv2Expander.setOnClickListener(new ExpanderLayoutHelper(R.id.rv_expander2));
      ...
      //another 8 listeners


      ExpanderLayoutHelper - using for expand/collapse animation of RV:



      public class ExpanderLayoutHelper implements View.OnClickListener {
      RelativeLayout expandWrapper;
      ImageView arrow;
      ExpandableLayout expandableLayout;

      ExpanderLayoutHelper(int relativeLayoutId) {
      this.expandWrapper = findViewById(relativeLayoutId);
      this.arrow = (ImageView) expandWrapper.getChildAt(1);
      this.expandableLayout = (ExpandableLayout) expandWrapper.getChildAt(2);
      }

      @Override
      public void onClick(View v) {
      if (expandableLayout.isCollapsed()) {
      expandableLayout.expand();
      expandWrapper.getChildAt(1).animate().rotation(90f).setDuration(1000);
      } else {
      expandableLayout.collapse();
      arrow.animate().rotation(0).setDuration(1000);
      }
      }
      }


      Other points will be here if i remember something important.




      1. initializeList() is just 1-20 list.add("something") operation. For every form I have unique lists, so I have 10 initialize methods now.


      2. When I draw 10 recyclers without adapters lists initialization, the app is not lagging. So, it lags about lines adapter = new RVAdapter(this, initialize(this));. I know I can try to solve it with multithread, but bad code and XML is not gone.











      share|improve this question















      My app is several checkboxes areas. On some event data from all checkboxes will be saved/sent/etc.



      All is working, but this Activity is loading about 7 seconds because my code is bad, so I need help in refactoring and optimize it.



      How it looks in the app:




      enter image description here







      enter image description here




      I have 10 forms with ~ 100 checkboxes summary. To draw it, I'm using 10 recyclers with 10 adapters. Every adapter initialize with his own list and have own layout manager.



      How can I make this code good?



      I can't pass all code, it's too large, so I give it apart.



      To draw one recycler I use it (variable names changed):



      //toolbar and questform
      ...
      <RelativeLayout android:id="@+id/rv_wrapper1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:padding="@dimen/padding_default">

      <TextView
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_alignParentStart="true"
      android:layout_alignParentLeft="true"
      android:text="@string/title1"
      android:textSize="@dimen/text_size_big" />

      <ImageView
      android:id="@+id/img_arrow_1"
      android:layout_width="@dimen/image_size_small"
      android:layout_height="@dimen/image_size_small"
      android:layout_alignParentRight="true"
      android:layout_marginEnd="@dimen/margin_default"
      android:layout_marginRight="@dimen/margin_default"
      android:src="@drawable/ic_expand" />


      <com.github.chuross.library.ExpandableLayout
      android:id="@+id/rv_expaner1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_below="@id/img_arrow_1"
      app:exl_duration="1000">

      <android.support.v7.widget.RecyclerView
      android:id="@+id/rv_1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_marginTop="@dimen/padding_small">
      </android.support.v7.widget.RecyclerView>
      </com.github.chuross.library.ExpandableLayout>
      </RelativeLayout>
      ///another recycles


      and I duplicate it 9 times on XML.



      Activity



      RecyclerView rv1 = findViewById(R.id.rv1);
      RecyclerView rv2 = findViewById(R.id.rv2);
      //another 8 RV.
      ...

      rv1Adapter = new RVAdapter(this, initializList1(this));
      rv2Adapter = new RVAdapter(this, initializList2(this));
      //another 8 adapters
      ...

      rv1.setAdapter(rv1Adapter);
      rv2.setAdapter(rv2Adapter);
      ...
      //another 8 setters

      RecyclerView.LayoutManager layoutManagerForRv1 = new GridLayoutManager(this, 3);
      RecyclerView.LayoutManager layoutManagerForRv2 = new GridLayoutManager(this, 3);
      ...
      //another 8 managers

      rv1.setLayoutManager(layoutManagerForRv1);
      rv2.setLayoutManager(layoutManagerForRv2);
      ...
      //another 8 setters for managers

      RelativeLayout rv1Expander = findViewById(R.id.rv_expander1);
      RelativeLayout rv2Expander = findViewById(R.id.rv_expander2);
      ...
      //another 8 RL

      rv1Expander.setOnClickListener(new ExpanderLayoutHelper(R.id.rv_expander1));
      rv2Expander.setOnClickListener(new ExpanderLayoutHelper(R.id.rv_expander2));
      ...
      //another 8 listeners


      ExpanderLayoutHelper - using for expand/collapse animation of RV:



      public class ExpanderLayoutHelper implements View.OnClickListener {
      RelativeLayout expandWrapper;
      ImageView arrow;
      ExpandableLayout expandableLayout;

      ExpanderLayoutHelper(int relativeLayoutId) {
      this.expandWrapper = findViewById(relativeLayoutId);
      this.arrow = (ImageView) expandWrapper.getChildAt(1);
      this.expandableLayout = (ExpandableLayout) expandWrapper.getChildAt(2);
      }

      @Override
      public void onClick(View v) {
      if (expandableLayout.isCollapsed()) {
      expandableLayout.expand();
      expandWrapper.getChildAt(1).animate().rotation(90f).setDuration(1000);
      } else {
      expandableLayout.collapse();
      arrow.animate().rotation(0).setDuration(1000);
      }
      }
      }


      Other points will be here if i remember something important.




      1. initializeList() is just 1-20 list.add("something") operation. For every form I have unique lists, so I have 10 initialize methods now.


      2. When I draw 10 recyclers without adapters lists initialization, the app is not lagging. So, it lags about lines adapter = new RVAdapter(this, initialize(this));. I know I can try to solve it with multithread, but bad code and XML is not gone.








      java performance android xml






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 2 hours ago









      Jamal

      30.3k11116226




      30.3k11116226










      asked yesterday









      KirstenLy

      514




      514






















          1 Answer
          1






          active

          oldest

          votes


















          -1














          As far as I understood the number of checkbox areas as well as the number of checkboxes in each area is fixed and will not grow dynamically. For a finite number of expandable areas and also a finite number of checkboxes in each area I wrote the code below, which works good for me. It works for 3 areas and 3 checkboxes in each area. A possible source of performance problems in my code is here:



          Extract from 'MainActivity':



          // Get all checkboxes
          // Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
          int tag=0; // Consecutive number of checkbox
          for (int i=1;i<=3;i++) { // # of checkbox areas
          for (int j = 1; j <= 3; j++) { // # of checkboxes per area
          int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
          CheckBox cb = (CheckBox) findViewById(id);
          // Set tag which acts as an unique id for this checkbox
          // Set this checkbox on listener....
          cb.setTag(++tag); // First checkbox=1....
          cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
          }
          }


          This code runs on the UI thread and may cause an ANR error (application not responding) if the loop takes a long time to finish. In that case one should consider using Android's asyncTask or threading.



          Layout file:



          <?xml version="1.0" encoding="utf-8"?>

          <!-- This is an example of an tabbed layout -->
          <!-- @rem:Expandable areas of an layout -->

          <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent">

          <TextView
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:textSize="20dp"
          android:paddingBottom="30dp"
          android:text="Collapsing checkboxes"/>

          <ScrollView
          android:layout_width="match_parent"
          android:layout_height="0dp"
          android:layout_weight=".5">

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent">

          <!-- Checkbox area 1 -->

          <LinearLayout
          android:id="@+id/tab_for_checkbox_area_1"
          android:orientation="horizontal"
          android:background="@color/colorAccent"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <TextView
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="2"
          android:textSize="20dp"
          android:text="Checkbox area 1"/>
          <Button
          android:id="@+id/button_expand_for_checkbox_area_1"
          android:text="+"
          android:layout_width="0dp"
          android:layout_weight=".5"
          android:layout_height="wrap_content"
          android:src="@android:drawable/ic_input_add"/>
          </LinearLayout>

          <RelativeLayout
          android:id="@+id/tab_contents_of_checkbox_area_1"
          android:visibility="gone"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <!-- Contents of Area 1 -->

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
          <CheckBox
          android:id="@+id/checkbox_1_1"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_1_2"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_1_3"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"/>
          </LinearLayout>
          </RelativeLayout>

          <!-- Checkbox area 2 -->

          <LinearLayout
          android:id="@+id/tab_for_checkbox_area_2"
          android:orientation="horizontal"
          android:background="@color/colorAccent"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <TextView
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="2"
          android:textSize="20dp"
          android:text="Checkbox area 2"/>
          <Button
          android:id="@+id/button_expand_for_checkbox_area_2"
          android:text="+"
          android:layout_width="0dp"
          android:layout_weight=".5"
          android:layout_height="wrap_content"
          android:src="@android:drawable/ic_input_add"/>
          </LinearLayout>

          <RelativeLayout
          android:id="@+id/tab_contents_of_checkbox_area_2"
          android:visibility="gone"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <!-- Contents of area 2 -->

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
          <CheckBox
          android:id="@+id/checkbox_2_1"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_2_2"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_2_3"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          </LinearLayout>
          </RelativeLayout>

          <!-- Checkbox area 3 -->

          <LinearLayout
          android:id="@+id/tab_for_checkbox_area_3"
          android:orientation="horizontal"
          android:background="@color/colorAccent"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <TextView
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="2"
          android:textSize="20dp"
          android:text="Checkbox area 3"/>
          <Button
          android:id="@+id/button_expand_for_checkbox_area_3"
          android:text="+"
          android:layout_width="0dp"
          android:layout_weight=".5"
          android:layout_height="wrap_content"
          android:src="@android:drawable/ic_input_add"/>
          </LinearLayout>

          <RelativeLayout
          android:id="@+id/tab_contents_of_checkbox_area_3"
          android:visibility="gone"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <!-- Contents of area 3 -->

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
          <CheckBox
          android:id="@+id/checkbox_3_1"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_3_2"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_3_3"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          </LinearLayout>
          </RelativeLayout>
          </LinearLayout>
          </ScrollView>
          </LinearLayout>


          Main Activity:



          package berthold.collapsingcheckboxarea;

          /**
          * Collapsing/ expandable layout example.
          *
          * @rem: Shows how parts of the layout can be collapsed, expanded@@
          * @rem: Shows how groups of layout elements can be set on a listener@@
          * @rem: and identified by an unique tag@@
          *
          * Applicable for a finite number of elements (expandable/ collapsing
          * areas of the layout and clickable elements in each area).
          *
          * If the number of expandable areas is not known and/ or will grow dynamically to a
          * large number, then one should use 'ListView' or 'RecyclerView'
          */

          import android.support.v7.app.AppCompatActivity;
          import android.os.Bundle;
          import android.util.Log;
          import android.view.View;
          import android.view.animation.Animation;
          import android.view.animation.AnimationUtils;
          import android.widget.Button;
          import android.widget.Button;
          import android.widget.CheckBox;
          import android.widget.CompoundButton;
          import android.widget.RelativeLayout;
          import android.widget.Toast;

          import java.util.ArrayList;
          import java.util.List;

          public class MainActivity extends AppCompatActivity {

          // Check box area 1
          private Button checkboxAreaOneExpand;
          private RelativeLayout contentsOfCheckboxAreaOne;

          // Check box area 2
          private Button checkboxAreaTwoExpand;
          private RelativeLayout contentsOfCheckboxAreaTwo;

          // Check box area 3
          private Button checkboxAreaThreeExpand;
          private RelativeLayout contentsOfCheckboxAreaThree;

          @Override
          protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);

          // UI
          checkboxAreaOneExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_1);
          contentsOfCheckboxAreaOne=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_1);

          checkboxAreaTwoExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_2);
          contentsOfCheckboxAreaTwo=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_2);

          checkboxAreaThreeExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_3);
          contentsOfCheckboxAreaThree=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_3);

          // Listeners for expand/ collapse buttons
          // Check box area one
          checkboxAreaOneExpand.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
          toggleView(checkboxAreaOneExpand,contentsOfCheckboxAreaOne);
          }
          });

          // Check box area two
          checkboxAreaTwoExpand.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
          toggleView(checkboxAreaTwoExpand,contentsOfCheckboxAreaTwo);
          }
          });

          // Check box area three
          checkboxAreaThreeExpand.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
          toggleView(checkboxAreaThreeExpand,contentsOfCheckboxAreaThree);
          }
          });

          // Inner Class contains callback method which will be executed, when
          // a checkbox was changed.
          CompoundButton.OnCheckedChangeListener myOnCheckedChangeListener=new CompoundButton.OnCheckedChangeListener() {
          @Override
          public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
          // Insert code to act accordingly.....
          // The 'getTag'- method of 'compoundButton' holds the 'tag' valaue assigned to
          // the checkbox consecutively.....
          Toast.makeText(getApplicationContext(), "Checkbox #"+compoundButton.getTag()+" changed", Toast.LENGTH_LONG).show();
          }
          };

          // Get all checkboxes
          // Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
          int tag=0; // Consecutive number of checkbox
          for (int i=1;i<=3;i++) { // # of checkbox areas
          for (int j = 1; j <= 3; j++) { // # of checkboxes per area
          int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
          CheckBox cb = (CheckBox) findViewById(id);
          // Set tag which acts as an unique id for this checkbox
          // Set this checkbox on listener....
          cb.setTag(++tag); // First checkbox=1....
          cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
          }
          }
          }

          /*
          * Toggle view, change button accordingly.....
          */

          private void toggleView(Button b, RelativeLayout v){
          if (v.isShown()) {
          b.setText("+");
          v.setVisibility(View.GONE);
          } else {
          b.setText("-");
          v.setVisibility(View.VISIBLE);
          }
          }
          }





          share|improve this answer










          New contributor




          Berthold Fritz is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.


















          • You have presented an alternative solution, but haven't reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) so that the author and other readers can learn from your thought process.
            – Jamal
            2 hours ago











          Your Answer





          StackExchange.ifUsing("editor", function () {
          return StackExchange.using("mathjaxEditing", function () {
          StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
          StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
          });
          });
          }, "mathjax-editing");

          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "196"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210541%2fandroid-app-with-several-checkbox-areas%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          -1














          As far as I understood the number of checkbox areas as well as the number of checkboxes in each area is fixed and will not grow dynamically. For a finite number of expandable areas and also a finite number of checkboxes in each area I wrote the code below, which works good for me. It works for 3 areas and 3 checkboxes in each area. A possible source of performance problems in my code is here:



          Extract from 'MainActivity':



          // Get all checkboxes
          // Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
          int tag=0; // Consecutive number of checkbox
          for (int i=1;i<=3;i++) { // # of checkbox areas
          for (int j = 1; j <= 3; j++) { // # of checkboxes per area
          int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
          CheckBox cb = (CheckBox) findViewById(id);
          // Set tag which acts as an unique id for this checkbox
          // Set this checkbox on listener....
          cb.setTag(++tag); // First checkbox=1....
          cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
          }
          }


          This code runs on the UI thread and may cause an ANR error (application not responding) if the loop takes a long time to finish. In that case one should consider using Android's asyncTask or threading.



          Layout file:



          <?xml version="1.0" encoding="utf-8"?>

          <!-- This is an example of an tabbed layout -->
          <!-- @rem:Expandable areas of an layout -->

          <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent">

          <TextView
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:textSize="20dp"
          android:paddingBottom="30dp"
          android:text="Collapsing checkboxes"/>

          <ScrollView
          android:layout_width="match_parent"
          android:layout_height="0dp"
          android:layout_weight=".5">

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent">

          <!-- Checkbox area 1 -->

          <LinearLayout
          android:id="@+id/tab_for_checkbox_area_1"
          android:orientation="horizontal"
          android:background="@color/colorAccent"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <TextView
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="2"
          android:textSize="20dp"
          android:text="Checkbox area 1"/>
          <Button
          android:id="@+id/button_expand_for_checkbox_area_1"
          android:text="+"
          android:layout_width="0dp"
          android:layout_weight=".5"
          android:layout_height="wrap_content"
          android:src="@android:drawable/ic_input_add"/>
          </LinearLayout>

          <RelativeLayout
          android:id="@+id/tab_contents_of_checkbox_area_1"
          android:visibility="gone"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <!-- Contents of Area 1 -->

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
          <CheckBox
          android:id="@+id/checkbox_1_1"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_1_2"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_1_3"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"/>
          </LinearLayout>
          </RelativeLayout>

          <!-- Checkbox area 2 -->

          <LinearLayout
          android:id="@+id/tab_for_checkbox_area_2"
          android:orientation="horizontal"
          android:background="@color/colorAccent"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <TextView
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="2"
          android:textSize="20dp"
          android:text="Checkbox area 2"/>
          <Button
          android:id="@+id/button_expand_for_checkbox_area_2"
          android:text="+"
          android:layout_width="0dp"
          android:layout_weight=".5"
          android:layout_height="wrap_content"
          android:src="@android:drawable/ic_input_add"/>
          </LinearLayout>

          <RelativeLayout
          android:id="@+id/tab_contents_of_checkbox_area_2"
          android:visibility="gone"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <!-- Contents of area 2 -->

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
          <CheckBox
          android:id="@+id/checkbox_2_1"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_2_2"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_2_3"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          </LinearLayout>
          </RelativeLayout>

          <!-- Checkbox area 3 -->

          <LinearLayout
          android:id="@+id/tab_for_checkbox_area_3"
          android:orientation="horizontal"
          android:background="@color/colorAccent"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <TextView
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="2"
          android:textSize="20dp"
          android:text="Checkbox area 3"/>
          <Button
          android:id="@+id/button_expand_for_checkbox_area_3"
          android:text="+"
          android:layout_width="0dp"
          android:layout_weight=".5"
          android:layout_height="wrap_content"
          android:src="@android:drawable/ic_input_add"/>
          </LinearLayout>

          <RelativeLayout
          android:id="@+id/tab_contents_of_checkbox_area_3"
          android:visibility="gone"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <!-- Contents of area 3 -->

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
          <CheckBox
          android:id="@+id/checkbox_3_1"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_3_2"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_3_3"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          </LinearLayout>
          </RelativeLayout>
          </LinearLayout>
          </ScrollView>
          </LinearLayout>


          Main Activity:



          package berthold.collapsingcheckboxarea;

          /**
          * Collapsing/ expandable layout example.
          *
          * @rem: Shows how parts of the layout can be collapsed, expanded@@
          * @rem: Shows how groups of layout elements can be set on a listener@@
          * @rem: and identified by an unique tag@@
          *
          * Applicable for a finite number of elements (expandable/ collapsing
          * areas of the layout and clickable elements in each area).
          *
          * If the number of expandable areas is not known and/ or will grow dynamically to a
          * large number, then one should use 'ListView' or 'RecyclerView'
          */

          import android.support.v7.app.AppCompatActivity;
          import android.os.Bundle;
          import android.util.Log;
          import android.view.View;
          import android.view.animation.Animation;
          import android.view.animation.AnimationUtils;
          import android.widget.Button;
          import android.widget.Button;
          import android.widget.CheckBox;
          import android.widget.CompoundButton;
          import android.widget.RelativeLayout;
          import android.widget.Toast;

          import java.util.ArrayList;
          import java.util.List;

          public class MainActivity extends AppCompatActivity {

          // Check box area 1
          private Button checkboxAreaOneExpand;
          private RelativeLayout contentsOfCheckboxAreaOne;

          // Check box area 2
          private Button checkboxAreaTwoExpand;
          private RelativeLayout contentsOfCheckboxAreaTwo;

          // Check box area 3
          private Button checkboxAreaThreeExpand;
          private RelativeLayout contentsOfCheckboxAreaThree;

          @Override
          protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);

          // UI
          checkboxAreaOneExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_1);
          contentsOfCheckboxAreaOne=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_1);

          checkboxAreaTwoExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_2);
          contentsOfCheckboxAreaTwo=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_2);

          checkboxAreaThreeExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_3);
          contentsOfCheckboxAreaThree=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_3);

          // Listeners for expand/ collapse buttons
          // Check box area one
          checkboxAreaOneExpand.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
          toggleView(checkboxAreaOneExpand,contentsOfCheckboxAreaOne);
          }
          });

          // Check box area two
          checkboxAreaTwoExpand.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
          toggleView(checkboxAreaTwoExpand,contentsOfCheckboxAreaTwo);
          }
          });

          // Check box area three
          checkboxAreaThreeExpand.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
          toggleView(checkboxAreaThreeExpand,contentsOfCheckboxAreaThree);
          }
          });

          // Inner Class contains callback method which will be executed, when
          // a checkbox was changed.
          CompoundButton.OnCheckedChangeListener myOnCheckedChangeListener=new CompoundButton.OnCheckedChangeListener() {
          @Override
          public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
          // Insert code to act accordingly.....
          // The 'getTag'- method of 'compoundButton' holds the 'tag' valaue assigned to
          // the checkbox consecutively.....
          Toast.makeText(getApplicationContext(), "Checkbox #"+compoundButton.getTag()+" changed", Toast.LENGTH_LONG).show();
          }
          };

          // Get all checkboxes
          // Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
          int tag=0; // Consecutive number of checkbox
          for (int i=1;i<=3;i++) { // # of checkbox areas
          for (int j = 1; j <= 3; j++) { // # of checkboxes per area
          int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
          CheckBox cb = (CheckBox) findViewById(id);
          // Set tag which acts as an unique id for this checkbox
          // Set this checkbox on listener....
          cb.setTag(++tag); // First checkbox=1....
          cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
          }
          }
          }

          /*
          * Toggle view, change button accordingly.....
          */

          private void toggleView(Button b, RelativeLayout v){
          if (v.isShown()) {
          b.setText("+");
          v.setVisibility(View.GONE);
          } else {
          b.setText("-");
          v.setVisibility(View.VISIBLE);
          }
          }
          }





          share|improve this answer










          New contributor




          Berthold Fritz is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.


















          • You have presented an alternative solution, but haven't reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) so that the author and other readers can learn from your thought process.
            – Jamal
            2 hours ago
















          -1














          As far as I understood the number of checkbox areas as well as the number of checkboxes in each area is fixed and will not grow dynamically. For a finite number of expandable areas and also a finite number of checkboxes in each area I wrote the code below, which works good for me. It works for 3 areas and 3 checkboxes in each area. A possible source of performance problems in my code is here:



          Extract from 'MainActivity':



          // Get all checkboxes
          // Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
          int tag=0; // Consecutive number of checkbox
          for (int i=1;i<=3;i++) { // # of checkbox areas
          for (int j = 1; j <= 3; j++) { // # of checkboxes per area
          int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
          CheckBox cb = (CheckBox) findViewById(id);
          // Set tag which acts as an unique id for this checkbox
          // Set this checkbox on listener....
          cb.setTag(++tag); // First checkbox=1....
          cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
          }
          }


          This code runs on the UI thread and may cause an ANR error (application not responding) if the loop takes a long time to finish. In that case one should consider using Android's asyncTask or threading.



          Layout file:



          <?xml version="1.0" encoding="utf-8"?>

          <!-- This is an example of an tabbed layout -->
          <!-- @rem:Expandable areas of an layout -->

          <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent">

          <TextView
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:textSize="20dp"
          android:paddingBottom="30dp"
          android:text="Collapsing checkboxes"/>

          <ScrollView
          android:layout_width="match_parent"
          android:layout_height="0dp"
          android:layout_weight=".5">

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent">

          <!-- Checkbox area 1 -->

          <LinearLayout
          android:id="@+id/tab_for_checkbox_area_1"
          android:orientation="horizontal"
          android:background="@color/colorAccent"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <TextView
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="2"
          android:textSize="20dp"
          android:text="Checkbox area 1"/>
          <Button
          android:id="@+id/button_expand_for_checkbox_area_1"
          android:text="+"
          android:layout_width="0dp"
          android:layout_weight=".5"
          android:layout_height="wrap_content"
          android:src="@android:drawable/ic_input_add"/>
          </LinearLayout>

          <RelativeLayout
          android:id="@+id/tab_contents_of_checkbox_area_1"
          android:visibility="gone"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <!-- Contents of Area 1 -->

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
          <CheckBox
          android:id="@+id/checkbox_1_1"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_1_2"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_1_3"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"/>
          </LinearLayout>
          </RelativeLayout>

          <!-- Checkbox area 2 -->

          <LinearLayout
          android:id="@+id/tab_for_checkbox_area_2"
          android:orientation="horizontal"
          android:background="@color/colorAccent"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <TextView
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="2"
          android:textSize="20dp"
          android:text="Checkbox area 2"/>
          <Button
          android:id="@+id/button_expand_for_checkbox_area_2"
          android:text="+"
          android:layout_width="0dp"
          android:layout_weight=".5"
          android:layout_height="wrap_content"
          android:src="@android:drawable/ic_input_add"/>
          </LinearLayout>

          <RelativeLayout
          android:id="@+id/tab_contents_of_checkbox_area_2"
          android:visibility="gone"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <!-- Contents of area 2 -->

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
          <CheckBox
          android:id="@+id/checkbox_2_1"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_2_2"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_2_3"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          </LinearLayout>
          </RelativeLayout>

          <!-- Checkbox area 3 -->

          <LinearLayout
          android:id="@+id/tab_for_checkbox_area_3"
          android:orientation="horizontal"
          android:background="@color/colorAccent"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <TextView
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="2"
          android:textSize="20dp"
          android:text="Checkbox area 3"/>
          <Button
          android:id="@+id/button_expand_for_checkbox_area_3"
          android:text="+"
          android:layout_width="0dp"
          android:layout_weight=".5"
          android:layout_height="wrap_content"
          android:src="@android:drawable/ic_input_add"/>
          </LinearLayout>

          <RelativeLayout
          android:id="@+id/tab_contents_of_checkbox_area_3"
          android:visibility="gone"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <!-- Contents of area 3 -->

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
          <CheckBox
          android:id="@+id/checkbox_3_1"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_3_2"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_3_3"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          </LinearLayout>
          </RelativeLayout>
          </LinearLayout>
          </ScrollView>
          </LinearLayout>


          Main Activity:



          package berthold.collapsingcheckboxarea;

          /**
          * Collapsing/ expandable layout example.
          *
          * @rem: Shows how parts of the layout can be collapsed, expanded@@
          * @rem: Shows how groups of layout elements can be set on a listener@@
          * @rem: and identified by an unique tag@@
          *
          * Applicable for a finite number of elements (expandable/ collapsing
          * areas of the layout and clickable elements in each area).
          *
          * If the number of expandable areas is not known and/ or will grow dynamically to a
          * large number, then one should use 'ListView' or 'RecyclerView'
          */

          import android.support.v7.app.AppCompatActivity;
          import android.os.Bundle;
          import android.util.Log;
          import android.view.View;
          import android.view.animation.Animation;
          import android.view.animation.AnimationUtils;
          import android.widget.Button;
          import android.widget.Button;
          import android.widget.CheckBox;
          import android.widget.CompoundButton;
          import android.widget.RelativeLayout;
          import android.widget.Toast;

          import java.util.ArrayList;
          import java.util.List;

          public class MainActivity extends AppCompatActivity {

          // Check box area 1
          private Button checkboxAreaOneExpand;
          private RelativeLayout contentsOfCheckboxAreaOne;

          // Check box area 2
          private Button checkboxAreaTwoExpand;
          private RelativeLayout contentsOfCheckboxAreaTwo;

          // Check box area 3
          private Button checkboxAreaThreeExpand;
          private RelativeLayout contentsOfCheckboxAreaThree;

          @Override
          protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);

          // UI
          checkboxAreaOneExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_1);
          contentsOfCheckboxAreaOne=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_1);

          checkboxAreaTwoExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_2);
          contentsOfCheckboxAreaTwo=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_2);

          checkboxAreaThreeExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_3);
          contentsOfCheckboxAreaThree=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_3);

          // Listeners for expand/ collapse buttons
          // Check box area one
          checkboxAreaOneExpand.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
          toggleView(checkboxAreaOneExpand,contentsOfCheckboxAreaOne);
          }
          });

          // Check box area two
          checkboxAreaTwoExpand.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
          toggleView(checkboxAreaTwoExpand,contentsOfCheckboxAreaTwo);
          }
          });

          // Check box area three
          checkboxAreaThreeExpand.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
          toggleView(checkboxAreaThreeExpand,contentsOfCheckboxAreaThree);
          }
          });

          // Inner Class contains callback method which will be executed, when
          // a checkbox was changed.
          CompoundButton.OnCheckedChangeListener myOnCheckedChangeListener=new CompoundButton.OnCheckedChangeListener() {
          @Override
          public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
          // Insert code to act accordingly.....
          // The 'getTag'- method of 'compoundButton' holds the 'tag' valaue assigned to
          // the checkbox consecutively.....
          Toast.makeText(getApplicationContext(), "Checkbox #"+compoundButton.getTag()+" changed", Toast.LENGTH_LONG).show();
          }
          };

          // Get all checkboxes
          // Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
          int tag=0; // Consecutive number of checkbox
          for (int i=1;i<=3;i++) { // # of checkbox areas
          for (int j = 1; j <= 3; j++) { // # of checkboxes per area
          int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
          CheckBox cb = (CheckBox) findViewById(id);
          // Set tag which acts as an unique id for this checkbox
          // Set this checkbox on listener....
          cb.setTag(++tag); // First checkbox=1....
          cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
          }
          }
          }

          /*
          * Toggle view, change button accordingly.....
          */

          private void toggleView(Button b, RelativeLayout v){
          if (v.isShown()) {
          b.setText("+");
          v.setVisibility(View.GONE);
          } else {
          b.setText("-");
          v.setVisibility(View.VISIBLE);
          }
          }
          }





          share|improve this answer










          New contributor




          Berthold Fritz is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.


















          • You have presented an alternative solution, but haven't reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) so that the author and other readers can learn from your thought process.
            – Jamal
            2 hours ago














          -1












          -1








          -1






          As far as I understood the number of checkbox areas as well as the number of checkboxes in each area is fixed and will not grow dynamically. For a finite number of expandable areas and also a finite number of checkboxes in each area I wrote the code below, which works good for me. It works for 3 areas and 3 checkboxes in each area. A possible source of performance problems in my code is here:



          Extract from 'MainActivity':



          // Get all checkboxes
          // Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
          int tag=0; // Consecutive number of checkbox
          for (int i=1;i<=3;i++) { // # of checkbox areas
          for (int j = 1; j <= 3; j++) { // # of checkboxes per area
          int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
          CheckBox cb = (CheckBox) findViewById(id);
          // Set tag which acts as an unique id for this checkbox
          // Set this checkbox on listener....
          cb.setTag(++tag); // First checkbox=1....
          cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
          }
          }


          This code runs on the UI thread and may cause an ANR error (application not responding) if the loop takes a long time to finish. In that case one should consider using Android's asyncTask or threading.



          Layout file:



          <?xml version="1.0" encoding="utf-8"?>

          <!-- This is an example of an tabbed layout -->
          <!-- @rem:Expandable areas of an layout -->

          <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent">

          <TextView
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:textSize="20dp"
          android:paddingBottom="30dp"
          android:text="Collapsing checkboxes"/>

          <ScrollView
          android:layout_width="match_parent"
          android:layout_height="0dp"
          android:layout_weight=".5">

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent">

          <!-- Checkbox area 1 -->

          <LinearLayout
          android:id="@+id/tab_for_checkbox_area_1"
          android:orientation="horizontal"
          android:background="@color/colorAccent"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <TextView
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="2"
          android:textSize="20dp"
          android:text="Checkbox area 1"/>
          <Button
          android:id="@+id/button_expand_for_checkbox_area_1"
          android:text="+"
          android:layout_width="0dp"
          android:layout_weight=".5"
          android:layout_height="wrap_content"
          android:src="@android:drawable/ic_input_add"/>
          </LinearLayout>

          <RelativeLayout
          android:id="@+id/tab_contents_of_checkbox_area_1"
          android:visibility="gone"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <!-- Contents of Area 1 -->

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
          <CheckBox
          android:id="@+id/checkbox_1_1"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_1_2"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_1_3"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"/>
          </LinearLayout>
          </RelativeLayout>

          <!-- Checkbox area 2 -->

          <LinearLayout
          android:id="@+id/tab_for_checkbox_area_2"
          android:orientation="horizontal"
          android:background="@color/colorAccent"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <TextView
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="2"
          android:textSize="20dp"
          android:text="Checkbox area 2"/>
          <Button
          android:id="@+id/button_expand_for_checkbox_area_2"
          android:text="+"
          android:layout_width="0dp"
          android:layout_weight=".5"
          android:layout_height="wrap_content"
          android:src="@android:drawable/ic_input_add"/>
          </LinearLayout>

          <RelativeLayout
          android:id="@+id/tab_contents_of_checkbox_area_2"
          android:visibility="gone"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <!-- Contents of area 2 -->

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
          <CheckBox
          android:id="@+id/checkbox_2_1"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_2_2"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_2_3"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          </LinearLayout>
          </RelativeLayout>

          <!-- Checkbox area 3 -->

          <LinearLayout
          android:id="@+id/tab_for_checkbox_area_3"
          android:orientation="horizontal"
          android:background="@color/colorAccent"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <TextView
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="2"
          android:textSize="20dp"
          android:text="Checkbox area 3"/>
          <Button
          android:id="@+id/button_expand_for_checkbox_area_3"
          android:text="+"
          android:layout_width="0dp"
          android:layout_weight=".5"
          android:layout_height="wrap_content"
          android:src="@android:drawable/ic_input_add"/>
          </LinearLayout>

          <RelativeLayout
          android:id="@+id/tab_contents_of_checkbox_area_3"
          android:visibility="gone"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <!-- Contents of area 3 -->

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
          <CheckBox
          android:id="@+id/checkbox_3_1"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_3_2"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_3_3"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          </LinearLayout>
          </RelativeLayout>
          </LinearLayout>
          </ScrollView>
          </LinearLayout>


          Main Activity:



          package berthold.collapsingcheckboxarea;

          /**
          * Collapsing/ expandable layout example.
          *
          * @rem: Shows how parts of the layout can be collapsed, expanded@@
          * @rem: Shows how groups of layout elements can be set on a listener@@
          * @rem: and identified by an unique tag@@
          *
          * Applicable for a finite number of elements (expandable/ collapsing
          * areas of the layout and clickable elements in each area).
          *
          * If the number of expandable areas is not known and/ or will grow dynamically to a
          * large number, then one should use 'ListView' or 'RecyclerView'
          */

          import android.support.v7.app.AppCompatActivity;
          import android.os.Bundle;
          import android.util.Log;
          import android.view.View;
          import android.view.animation.Animation;
          import android.view.animation.AnimationUtils;
          import android.widget.Button;
          import android.widget.Button;
          import android.widget.CheckBox;
          import android.widget.CompoundButton;
          import android.widget.RelativeLayout;
          import android.widget.Toast;

          import java.util.ArrayList;
          import java.util.List;

          public class MainActivity extends AppCompatActivity {

          // Check box area 1
          private Button checkboxAreaOneExpand;
          private RelativeLayout contentsOfCheckboxAreaOne;

          // Check box area 2
          private Button checkboxAreaTwoExpand;
          private RelativeLayout contentsOfCheckboxAreaTwo;

          // Check box area 3
          private Button checkboxAreaThreeExpand;
          private RelativeLayout contentsOfCheckboxAreaThree;

          @Override
          protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);

          // UI
          checkboxAreaOneExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_1);
          contentsOfCheckboxAreaOne=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_1);

          checkboxAreaTwoExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_2);
          contentsOfCheckboxAreaTwo=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_2);

          checkboxAreaThreeExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_3);
          contentsOfCheckboxAreaThree=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_3);

          // Listeners for expand/ collapse buttons
          // Check box area one
          checkboxAreaOneExpand.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
          toggleView(checkboxAreaOneExpand,contentsOfCheckboxAreaOne);
          }
          });

          // Check box area two
          checkboxAreaTwoExpand.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
          toggleView(checkboxAreaTwoExpand,contentsOfCheckboxAreaTwo);
          }
          });

          // Check box area three
          checkboxAreaThreeExpand.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
          toggleView(checkboxAreaThreeExpand,contentsOfCheckboxAreaThree);
          }
          });

          // Inner Class contains callback method which will be executed, when
          // a checkbox was changed.
          CompoundButton.OnCheckedChangeListener myOnCheckedChangeListener=new CompoundButton.OnCheckedChangeListener() {
          @Override
          public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
          // Insert code to act accordingly.....
          // The 'getTag'- method of 'compoundButton' holds the 'tag' valaue assigned to
          // the checkbox consecutively.....
          Toast.makeText(getApplicationContext(), "Checkbox #"+compoundButton.getTag()+" changed", Toast.LENGTH_LONG).show();
          }
          };

          // Get all checkboxes
          // Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
          int tag=0; // Consecutive number of checkbox
          for (int i=1;i<=3;i++) { // # of checkbox areas
          for (int j = 1; j <= 3; j++) { // # of checkboxes per area
          int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
          CheckBox cb = (CheckBox) findViewById(id);
          // Set tag which acts as an unique id for this checkbox
          // Set this checkbox on listener....
          cb.setTag(++tag); // First checkbox=1....
          cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
          }
          }
          }

          /*
          * Toggle view, change button accordingly.....
          */

          private void toggleView(Button b, RelativeLayout v){
          if (v.isShown()) {
          b.setText("+");
          v.setVisibility(View.GONE);
          } else {
          b.setText("-");
          v.setVisibility(View.VISIBLE);
          }
          }
          }





          share|improve this answer










          New contributor




          Berthold Fritz is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.









          As far as I understood the number of checkbox areas as well as the number of checkboxes in each area is fixed and will not grow dynamically. For a finite number of expandable areas and also a finite number of checkboxes in each area I wrote the code below, which works good for me. It works for 3 areas and 3 checkboxes in each area. A possible source of performance problems in my code is here:



          Extract from 'MainActivity':



          // Get all checkboxes
          // Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
          int tag=0; // Consecutive number of checkbox
          for (int i=1;i<=3;i++) { // # of checkbox areas
          for (int j = 1; j <= 3; j++) { // # of checkboxes per area
          int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
          CheckBox cb = (CheckBox) findViewById(id);
          // Set tag which acts as an unique id for this checkbox
          // Set this checkbox on listener....
          cb.setTag(++tag); // First checkbox=1....
          cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
          }
          }


          This code runs on the UI thread and may cause an ANR error (application not responding) if the loop takes a long time to finish. In that case one should consider using Android's asyncTask or threading.



          Layout file:



          <?xml version="1.0" encoding="utf-8"?>

          <!-- This is an example of an tabbed layout -->
          <!-- @rem:Expandable areas of an layout -->

          <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent">

          <TextView
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:textSize="20dp"
          android:paddingBottom="30dp"
          android:text="Collapsing checkboxes"/>

          <ScrollView
          android:layout_width="match_parent"
          android:layout_height="0dp"
          android:layout_weight=".5">

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent">

          <!-- Checkbox area 1 -->

          <LinearLayout
          android:id="@+id/tab_for_checkbox_area_1"
          android:orientation="horizontal"
          android:background="@color/colorAccent"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <TextView
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="2"
          android:textSize="20dp"
          android:text="Checkbox area 1"/>
          <Button
          android:id="@+id/button_expand_for_checkbox_area_1"
          android:text="+"
          android:layout_width="0dp"
          android:layout_weight=".5"
          android:layout_height="wrap_content"
          android:src="@android:drawable/ic_input_add"/>
          </LinearLayout>

          <RelativeLayout
          android:id="@+id/tab_contents_of_checkbox_area_1"
          android:visibility="gone"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <!-- Contents of Area 1 -->

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
          <CheckBox
          android:id="@+id/checkbox_1_1"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_1_2"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_1_3"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"/>
          </LinearLayout>
          </RelativeLayout>

          <!-- Checkbox area 2 -->

          <LinearLayout
          android:id="@+id/tab_for_checkbox_area_2"
          android:orientation="horizontal"
          android:background="@color/colorAccent"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <TextView
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="2"
          android:textSize="20dp"
          android:text="Checkbox area 2"/>
          <Button
          android:id="@+id/button_expand_for_checkbox_area_2"
          android:text="+"
          android:layout_width="0dp"
          android:layout_weight=".5"
          android:layout_height="wrap_content"
          android:src="@android:drawable/ic_input_add"/>
          </LinearLayout>

          <RelativeLayout
          android:id="@+id/tab_contents_of_checkbox_area_2"
          android:visibility="gone"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <!-- Contents of area 2 -->

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
          <CheckBox
          android:id="@+id/checkbox_2_1"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_2_2"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_2_3"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          </LinearLayout>
          </RelativeLayout>

          <!-- Checkbox area 3 -->

          <LinearLayout
          android:id="@+id/tab_for_checkbox_area_3"
          android:orientation="horizontal"
          android:background="@color/colorAccent"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <TextView
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="2"
          android:textSize="20dp"
          android:text="Checkbox area 3"/>
          <Button
          android:id="@+id/button_expand_for_checkbox_area_3"
          android:text="+"
          android:layout_width="0dp"
          android:layout_weight=".5"
          android:layout_height="wrap_content"
          android:src="@android:drawable/ic_input_add"/>
          </LinearLayout>

          <RelativeLayout
          android:id="@+id/tab_contents_of_checkbox_area_3"
          android:visibility="gone"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

          <!-- Contents of area 3 -->

          <LinearLayout
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
          <CheckBox
          android:id="@+id/checkbox_3_1"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_3_2"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          <CheckBox
          android:id="@+id/checkbox_3_3"
          android:text="First checkbox"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
          </LinearLayout>
          </RelativeLayout>
          </LinearLayout>
          </ScrollView>
          </LinearLayout>


          Main Activity:



          package berthold.collapsingcheckboxarea;

          /**
          * Collapsing/ expandable layout example.
          *
          * @rem: Shows how parts of the layout can be collapsed, expanded@@
          * @rem: Shows how groups of layout elements can be set on a listener@@
          * @rem: and identified by an unique tag@@
          *
          * Applicable for a finite number of elements (expandable/ collapsing
          * areas of the layout and clickable elements in each area).
          *
          * If the number of expandable areas is not known and/ or will grow dynamically to a
          * large number, then one should use 'ListView' or 'RecyclerView'
          */

          import android.support.v7.app.AppCompatActivity;
          import android.os.Bundle;
          import android.util.Log;
          import android.view.View;
          import android.view.animation.Animation;
          import android.view.animation.AnimationUtils;
          import android.widget.Button;
          import android.widget.Button;
          import android.widget.CheckBox;
          import android.widget.CompoundButton;
          import android.widget.RelativeLayout;
          import android.widget.Toast;

          import java.util.ArrayList;
          import java.util.List;

          public class MainActivity extends AppCompatActivity {

          // Check box area 1
          private Button checkboxAreaOneExpand;
          private RelativeLayout contentsOfCheckboxAreaOne;

          // Check box area 2
          private Button checkboxAreaTwoExpand;
          private RelativeLayout contentsOfCheckboxAreaTwo;

          // Check box area 3
          private Button checkboxAreaThreeExpand;
          private RelativeLayout contentsOfCheckboxAreaThree;

          @Override
          protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);

          // UI
          checkboxAreaOneExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_1);
          contentsOfCheckboxAreaOne=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_1);

          checkboxAreaTwoExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_2);
          contentsOfCheckboxAreaTwo=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_2);

          checkboxAreaThreeExpand=(Button)findViewById(R.id.button_expand_for_checkbox_area_3);
          contentsOfCheckboxAreaThree=(RelativeLayout)findViewById(R.id.tab_contents_of_checkbox_area_3);

          // Listeners for expand/ collapse buttons
          // Check box area one
          checkboxAreaOneExpand.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
          toggleView(checkboxAreaOneExpand,contentsOfCheckboxAreaOne);
          }
          });

          // Check box area two
          checkboxAreaTwoExpand.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
          toggleView(checkboxAreaTwoExpand,contentsOfCheckboxAreaTwo);
          }
          });

          // Check box area three
          checkboxAreaThreeExpand.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
          toggleView(checkboxAreaThreeExpand,contentsOfCheckboxAreaThree);
          }
          });

          // Inner Class contains callback method which will be executed, when
          // a checkbox was changed.
          CompoundButton.OnCheckedChangeListener myOnCheckedChangeListener=new CompoundButton.OnCheckedChangeListener() {
          @Override
          public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
          // Insert code to act accordingly.....
          // The 'getTag'- method of 'compoundButton' holds the 'tag' valaue assigned to
          // the checkbox consecutively.....
          Toast.makeText(getApplicationContext(), "Checkbox #"+compoundButton.getTag()+" changed", Toast.LENGTH_LONG).show();
          }
          };

          // Get all checkboxes
          // Name convention in XML: 'checkbox_i_j' where i= Number of Checkbox area j=number of checkbox that in area...
          int tag=0; // Consecutive number of checkbox
          for (int i=1;i<=3;i++) { // # of checkbox areas
          for (int j = 1; j <= 3; j++) { // # of checkboxes per area
          int id = getResources().getIdentifier("checkbox_" + i+"_"+j, "id", getPackageName());
          CheckBox cb = (CheckBox) findViewById(id);
          // Set tag which acts as an unique id for this checkbox
          // Set this checkbox on listener....
          cb.setTag(++tag); // First checkbox=1....
          cb.setOnCheckedChangeListener(myOnCheckedChangeListener);
          }
          }
          }

          /*
          * Toggle view, change button accordingly.....
          */

          private void toggleView(Button b, RelativeLayout v){
          if (v.isShown()) {
          b.setText("+");
          v.setVisibility(View.GONE);
          } else {
          b.setText("-");
          v.setVisibility(View.VISIBLE);
          }
          }
          }






          share|improve this answer










          New contributor




          Berthold Fritz is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.









          share|improve this answer



          share|improve this answer








          edited 2 hours ago









          Jamal

          30.3k11116226




          30.3k11116226






          New contributor




          Berthold Fritz is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.









          answered 8 hours ago









          Berthold Fritz

          93




          93




          New contributor




          Berthold Fritz is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.





          New contributor





          Berthold Fritz is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.






          Berthold Fritz is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.












          • You have presented an alternative solution, but haven't reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) so that the author and other readers can learn from your thought process.
            – Jamal
            2 hours ago


















          • You have presented an alternative solution, but haven't reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) so that the author and other readers can learn from your thought process.
            – Jamal
            2 hours ago
















          You have presented an alternative solution, but haven't reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) so that the author and other readers can learn from your thought process.
          – Jamal
          2 hours ago




          You have presented an alternative solution, but haven't reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) so that the author and other readers can learn from your thought process.
          – Jamal
          2 hours ago


















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Code Review Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          Use MathJax to format equations. MathJax reference.


          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210541%2fandroid-app-with-several-checkbox-areas%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Morgemoulin

          Scott Moir

          Souastre