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