Correct way to check all checkboxes in ListView?
Asked Answered
S

4

9

I have a ListView with set CHOICE_MODE_MULTIPLE. I also have additional header to manage (un)selecting all the items. The question is : is it correct way to do that? Well it works, however I'm not sure thats proper way. As you see below there is an checkAllCheckBoxes object which I pass to header onClickListener() method. What do you think? Would be grateful for any responses.

private OnClickListener checkAllCheckboxes = new OnClickListener(){
    public void onClick(View v) {
        ListView lv = getListView();
        int size = getListAdapter().getCount();
        if(lv.isItemChecked(0)){
            for(int i = 0; i<=size; i++){
                lv.setItemChecked(i, false);
            }
        } else {
            for(int i = 0; i<=size; i++){
                lv.setItemChecked(i, true);
            }
        }
    }

};
Stelu answered 2/2, 2011 at 15:11 Comment(1)
Thanks guys for responses, good points. Well I'm also wondering maybe it would be better to add that listener to listview instead on header only, as if all items are selected and I unselect one from the middle, the header still is selected and it does not look wellStelu
C
9

You can optimize your code like this :

Replace

if(lv.isItemChecked(0)){
    for(int i = 0; i<=size; i++){
        lv.setItemChecked(i, false);
    }
} else {
    for(int i = 0; i<=size; i++){
        lv.setItemChecked(i, true);
    }
}

by

    boolean check = lv.isItemChecked(0);
    for(int i = 0; i <= size; i++)
        lv.setItemChecked(i, !check);
Castanets answered 2/2, 2011 at 15:18 Comment(0)
H
2

This should do the same thing and is a little more concise. The loop starts at 1 because you don't want to reset the checked state of the header, and the header is index 0.

private OnClickListener checkAllCheckboxes = new OnClickListener(){
    public void onClick(View v) {
        ListView lv = getListView();
        int size = lv.getAdapter().getCount();
        boolean checked = lv.isItemChecked(0);
        for(int i=1; i<size; i++) {
          lv.setItemChecked(i, checked);
        }
    }

};
Halfhardy answered 2/2, 2011 at 15:18 Comment(1)
I'm not sure this is right. In his code when lv.isItemChecked(0) returns true he uses setItemChecked(i, false) so the boolean value is reversed. Starting at 1 also doesn't reverse the first value.Castanets
A
0

where Length is array length in the array and chkbox is select all checkbox.

chkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // TODO Auto-generated method stub
            if(chkbox.isChecked())
            {

                for(i=0;i<length;i++)
                {

                                    lv.setItemChecked(i, true);
                }

            }
            else
            {
                for(i=0;i<length;i++)
                {

                                    lv.setItemChecked(i, false);
                }


            }

        }
    });
Avner answered 31/5, 2014 at 5:32 Comment(0)
R
0

Robby's solution worked for me. As i have to make an addition in that. adapter update is also required, otherwise when you scroll the list checkbox will restore.

private OnClickListener checkAllCheckboxes = new OnClickListener(){
    public void onClick(View v) {
        ListView lv = getListView();
        int size = lv.getAdapter().getCount();
        boolean checked = lv.isItemChecked(0);
        for(int i=1; i<size; i++) {
          lv.setItemChecked(i, checked);

           CustomListItem it = CustomAdapter.get(i);
           it.setChk(check); // set value in adapter
        }
    }
};
Ries answered 26/5, 2017 at 9:53 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.