Dan
Dan

Reputation: 179

Correct way to check all checkboxes in ListView?

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);
            }
        }
    }

};

Upvotes: 9

Views: 16262

Answers (4)

Ricky
Ricky

Reputation: 135

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
        }
    }
};

Upvotes: 0

Hemal Adani
Hemal Adani

Reputation: 37

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);
                }


            }

        }
    });

Upvotes: 0

Robby Pond
Robby Pond

Reputation: 73484

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);
        }
    }

};

Upvotes: 2

Dalmas
Dalmas

Reputation: 26547

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);

Upvotes: 9

Related Questions