私はカスタム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);
}
}
そして、子供のためのCheckBox
setOnCheckedChangeListener
内部getChildView
に私はnotifyDataSetChanged();
を召喚。
しかし、私はいくつかの奇妙な振る舞いをしています。たとえば、グループに3つの子があり、1番目を選択しようとしている場合は、2番目と3番目を選択します。
私はnotifyDataSetChanged();
を間違った場所に置いたからだと思いますが、どこで正確に修正するのか分かりません。
item.isSelected = isChecked; item.setSelected(isChecked); これは冗長ではありませんか? if(同じフィールドを更新する)の最初のメソッドselectGroup()を使うと、llokがあるはずです。なぜなら、if条件がなければ、あなたは奇妙な/意図しない振る舞いをするかもしれないからです –