儿童CheckBox

时间:2016-05-11 09:39:35

标签: android checkbox

我有自定义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);
    }
}

然后,在getChildViewsetOnCheckedChangeListener内{child} CheckBox召唤notifyDataSetChanged();

但是我得到了一些奇怪的行为 - 例如,如果小组有3个孩子并且我试图选择第1个孩子,那么它会选择第2个和第3个。

我想,这是因为我把notifyDataSetChanged();放在了错误的地方,但我无法确定究竟在哪里以及如何解决它。

1 个答案:

答案 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