2016-05-11 8 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); 
    } 
} 

そして、子供のためのCheckBoxsetOnCheckedChangeListener内部getChildViewに私はnotifyDataSetChanged();を召喚。

しかし、私はいくつかの奇妙な振る舞いをしています。たとえば、グループに3つの子があり、1番目を選択しようとしている場合は、2番目と3番目を選択します。

私はnotifyDataSetChanged();を間違った場所に置いたからだと思いますが、どこで正確に修正するのか分かりません。

+0

item.isSelected = isChecked; item.setSelected(isChecked); これは冗長ではありませんか? if(同じフィールドを更新する)の最初のメソッドselectGroup()を使うと、llokがあるはずです。なぜなら、if条件がなければ、あなたは奇妙な/意図しない振る舞いをするかもしれないからです –

答えて

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

をそしてOnCheckedChangeListener中にあなたgetChildViewメソッドの内部でそれを召喚:

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

あなたが設定する前に、また、あなたのsetOnCheckedChangeListenergetChildView内をnullに設定することを忘れないでくださいCheckBox状態でなければ、奇妙な動作が発生します。

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

すべて子供の選択を解除すると、グループCheckBoxの選択も解除されます。

関連する問題