我有自定义ExpendableListViewAdapter
。像这样:
他所有的小组和小孩都有复选框。
我希望父亲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);
}
}
然后,在getChildView
内setOnCheckedChangeListener
内{child} CheckBox
召唤notifyDataSetChanged();
。
但是我得到了一些奇怪的行为 - 例如,如果小组有3个孩子并且我试图选择第1个孩子,那么它会选择第2个和第3个。
我想,这是因为我把notifyDataSetChanged();
放在了错误的地方,但我无法确定究竟在哪里以及如何解决它。
答案 0 :(得分: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();
}
});
另外,在设置setOnCheckedChangeListener
状态之前,不要忘记将getChildView
设置为CheckBox
,否则会出现一些奇怪的行为:
holder.cbChild.setOnCheckedChangeListener(null);
holder.cbChild.setChecked(child.isSelected());
所有这一切也会在您取消选择所有孩子后立即取消选择您的论坛CheckBox
。