2016-05-11 34 views
0

我有一个自定义ExpendableListViewAdapter。就像这样:Android儿童CheckBox的不正确行为

  • 集团
    • 儿童
    • 儿童
    • 儿童
  • 集团

他所有的团体和孩子的有复选框。

我希望父母CheckBox当他所有的孩子被检查时动态检查自己。

如何实现这个?

我已经实现了选择儿童,然后选择父元素。

这是我的方法就可以了:

void selectGroup(boolean isSelected) { 
    for (Item itemChild : item.getItems()) { 
     if (isSelected) itemChild.isSelected = true; 
     else itemChild.isSelected = false; 
     itemChild.setSelected(isSelected); 
    } 
    notifyDataSetChanged(); 
} 

我召唤它里面getGroupView

holder.cbChild.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      item.isSelected = isChecked; 
      item.setSelected(isChecked); 
      if (getChildrenCount(groupPosition) != 0) { 
       selectGroup(item.isSelected); 
      } 
     } 
    }); 

,它工作正常。

我试着实现家长选择以及。

方法:

public boolean isAllChildrenSelected(int groupPosition) { 
    int selectedNumber = 0; 

    for (int i = 0; i < getChildrenCount(groupPosition); i++) { 
     Item itemChild = getChild(groupPosition, i); 
     if (itemChild.isSelected) { 
      selectedNumber++; 
     } 
    } 

    if (selectedNumber == getChildrenCount(groupPosition)) { 
     notifyDataSetChanged(); 
     return true; 
    } else return false; 
} 

我召唤这种方法我getGroupView里面还有:

if (getChildrenCount(groupPosition) != 0) { 
     if (isAllChildrenSelected(groupPosition)) { 
      holder.cbChild.setChecked(true); 
    } 
} 

,然后在里面getChildViewsetOnCheckedChangeListener孩子CheckBox我召唤notifyDataSetChanged();

但我收到了一些奇怪的行为 - 例如,如果组有3个孩子,我试图选择第一个,它选择第二和第三。

我认为,这是因为我把notifyDataSetChanged();放在了一个错误的地方,但我无法弄清楚究竟在哪里以及如何解决它。

+0

item.isSelected = isChecked; item.setSelected(isChecked); 这不是多余的?如果它是相同的(更新相同的字段)第一个方法selectGroup(),你应该有一个llok,因为如果条件没有{},它可能会给你一个奇怪的/无意的行为 –

回答

0

好吧,它看起来像我已经知道了。

添加这个方法:

private void selectGroupIfAllChildrenSelected() { 
    int numSelected = 0; 

    for (Child child: group.getChildrenList()) { 
     if (child.isSelected()) { 
      numSelected++; 
     } 
     if (group.getChildrenList().size() == numSelected) { 
      group.setSelected(true); 
     } else if (numSelected == 0) { 
      group.setSelected(false); 
     } 
    } 
    notifyDataSetChanged(); 
} 

,并传召它你getChildView法里内OnCheckedChangeListener:也

 holder.cbChild.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      child.setSelected(isChecked); 
      selectGroupIfAllChildrenSelected(); 
     } 
    }); 

,不要忘记设置为空的setOnCheckedChangeListenergetChildView您设置了前CheckBox状态,否则你会得到一些奇怪的行为:

holder.cbChild.setOnCheckedChangeListener(null); 
holder.cbChild.setChecked(child.isSelected()); 

所有这些也将取消选择所有的孩子,然后取消您的群组CheckBox