简体   繁体   中英

How to select all checkboxes, while clicking the main checkbox in android?

I need selecting the main checkbox, the all other partial checkboxes also selected

My Requirement is ,I have a checkbox selectAll and some other checkboxes,by clicking this selectAll checkbox ,all other checkboxes must selected.And while clicking the partial checkbox the selectAll checkbox selection must gone.

 selectAllCheckbox.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                CheckBox cb = (CheckBox) view;
                isPartial = true;
                splitItemAdapter.selectAllItem(cb.isChecked());
                if (isFromCashPayment) {
                    if (cb.isChecked()) {
                      selectAllCheckbox.setChecked(true);
                      isitemChecked = true;




                    } else {

                        selectAllCheckbox.setChecked(false);

                        isitemChecked = false;



                    }
                }
            }
        });

You can use this way. Firstly, all checkbox to be in one layout. And then you use this code block.

layout.xml

...
 <CheckBox android:id="@+id/allCheckbox" />
 <LinearLayout android:id="@+id/checkboxLayouts"...>

               <CheckBox  android:layout_width="wrap_content"
                         android:layout_height="wrap_content"/>

               <CheckBox  android:layout_width="wrap_content"
                         android:layout_height="wrap_content"/>

               <CheckBox android:layout_width="wrap_content"
                         android:layout_height="wrap_content"/>

               <CheckBox  android:layout_width="wrap_content"
                         android:layout_height="wrap_content"/>
</LinearLayout>
...

Code

LinearLayout checkboxLayout = findViewById(R.id.checkboxLayouts);

checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
   @Override
   public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
       for(int i=0 ; i < checkboxLayout.getChildCount(); i++) {
          if(checkboxLayout.getChildAt(i) instanceof CheckBox) {
             ((CheckBox) checkboxLayout.getChildAt(i)).setChecked(isChecked);
          }
       }
 }
});

Note: I can't check code. Sorry for syntax error.

You can try this code:

OnCreate

        parent = findViewById(R.id.parent_checkbox);
        child1 = findViewById(R.id.child_checkbox_1);
        child2 = findViewById(R.id.child_checkbox_2);

        parent.setOnCheckedChangeListener(this);
        child1.setOnCheckedChangeListener(this);
        child2.setOnCheckedChangeListener(this);

OnCheckChanged

@Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        checkCheckBox(buttonView);
    }

checkCheckBox Method

public void checkCheckBox(View view){
     if (parent.isChecked() && view.getId() == R.id.parent_checkbox){
         child1.setChecked(true);
         child2.setChecked(true);
     }
     else if (!parent.isChecked() && view.getId() == R.id.parent_checkbox){
         if (child1.isChecked() && child2.isChecked()){
             child1.setChecked(false);
             child2.setChecked(false);
         }
     }
     else if (!parent.isChecked()){
         if (child1.isChecked() && child2.isChecked()){
             parent.setChecked(true);
         }
     }
     else if (parent.isChecked() && !child1.isChecked() || !child2.isChecked()){
         parent.setChecked(false);
     }
    }

Checkout the logic with this demo kotlin code...

        checkBox1.setOnClickListener {
            if (checkBox2.isChecked) {
                selectAllCheckbox.isChecked = true
            }

            if (!checkBox2.isChecked || !checkBox1.isChecked) {
                selectAllCheckbox.isChecked = false
            }
        }
        checkBox2.setOnClickListener {
            if (checkBox1.isChecked) {
                selectAllCheckbox.isChecked = true
            }
            if (!checkBox1.isChecked || !checkBox2.isChecked) {
                selectAllCheckbox.isChecked = false
            }
        }
        selectAllCheckbox.setOnClickListener {
            if (selectAllCheckbox.isChecked) {
                checkBox1.isChecked = true
                checkBox2.isChecked = true
            }
            if (!selectAllCheckbox.isChecked) {
                checkBox1.isChecked = false
                checkBox2.isChecked = false
            }
        }

The implementation of Select All Checkboxes function is as below, the code is simpler in Kotlin language:

private val checkboxes by lazy {
    listOf(
        checkbox1,
        checkbox2,
        checkbox3,
        checkboxX
    )
}

// can implement the CompoundButton.OnCheckedChangeListener on an Activity or Fragment instead
private val onCheckedChangeListener = CompoundButton.OnCheckedChangeListener { button, isChecked ->
    if (!buttonView.isPressed)
        // note that this breaks when accessibility mode is enabled,
        // e.g. isPressed() returns false e.g. when the event is triggered by a double tap from voice assistant.
        return

    when(buttonView.id) {
        R.id.checkboxSelectAll -> {
            checkboxes.forEach { it.isChecked = isChecked }
        }
        else -> {
            if (isChecked && checkboxes.all { it.isChecked }) {
                checkboxSelectAll.isChecked = true
            } else if (!isChecked && checkboxSelectAll.isChecked) {
                checkboxSelectAll.isChecked = false
            }
        }
    }
}

// assume this code is within an Activity
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.your_activity)

    checkboxSelectAll.setOnCheckedChangeListener(onCheckedChangeListener);
    checkboxes.forEach { it.setOnCheckedChangeListener(onCheckedChangeListener) }
}

*Note that this solution is not working for apps that are required to support accessibility.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM