title: CheckBox states in ExpandableListView's children
body: <p>I've read about 30 pages from SO as well as tutorials about tracking check states in lists but info (especially working info) is scarce on doing so in an Expandable ListView.</p>
  
  <p>I've got the children populating with checkboxes but when I check a box on a child from 1 group, random children in other groups also check.  I need to stop this.  The best info I think I read was to set the checkbox as a separate tag but I don't know how to set multiple tags, when I tried, I got a class mismatch error comparing the checkbox to the convertview.</p>
  
  <p>Has anybody come across a good way to keep track of checkbox states in an expandablelistview's children?</p>
  
  <p>I've made multiple changes so I'm putting in the entire adapter code.  Please check first few lines of getGroupView and entire getChildView and help me see what I'm doing wrong.</p>
  
  <p>EDIT:
  What's happening now is that when I check a box and then expand another group, all checked boxes uncheck:</p>
  
  <pre><code>public class MyExpandableListAdapter extends BaseExpandableListAdapter
      implements OnCheckedChangeListener {
  
  private Context mContext;
  
  private ArrayList&lt;ContactNameItems&gt; mListDataHeader;
  private HashMap&lt;String, List&lt;ContactPhoneItems&gt;&gt; mListDataChild;
  
  private boolean[] mGetChecked;
  private HashMap&lt;String, boolean[]&gt; mChildCheckStates;
  
  private ArrayList&lt;String&gt; selectedNumbers;
  
  private ChildViewHolder childViewHolder;
  private GroupViewHolder groupViewHolder;
  
  private String numberText;
  
  public MyExpandableListAdapter(Context context,
          ArrayList&lt;ContactNameItems&gt; listDataHeader,
          HashMap&lt;String, List&lt;ContactPhoneItems&gt;&gt; listDataChild,
          ArrayList&lt;String&gt; listOfNumbers) {
  
      mContext = context;
      mListDataHeader = listDataHeader;
      mListDataChild = listDataChild;
      selectedNumbers = listOfNumbers;
  
      mChildCheckStates = new HashMap&lt;String, boolean[]&gt;();
  }
  
  @Override
  public int getGroupCount() {
      return mListDataHeader.size();
  }
  
  @Override
  public ContactNameItems getGroup(int groupPosition) {
      return mListDataHeader.get(groupPosition);
  }
  
  @Override
  public long getGroupId(int groupPosition) {
      return groupPosition;
  }
  
  @Override
  public View getGroupView(int groupPosition, boolean isExpanded,
          View convertView, ViewGroup parent) {
  
      String contactName = getGroup(groupPosition).getName();
      Bitmap contactImage = getGroup(groupPosition).getImage();
  
      mGetChecked = new boolean[getChildrenCount(groupPosition)];
      mChildCheckStates.put(contactName, mGetChecked);
  
      if (convertView == null) {
  
          LayoutInflater inflater = (LayoutInflater) mContext
                  .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          convertView = inflater.inflate(R.layout.contact_name_item, null);
  
          groupViewHolder = new GroupViewHolder();
  
          groupViewHolder.mContactName = (TextView) convertView
                  .findViewById(R.id.lblListHeader);
  
          groupViewHolder.mContactImage = (ImageView) convertView
                  .findViewById(R.id.ivContactPhoto);
  
          convertView.setTag(groupViewHolder);
      } else {
  
          groupViewHolder = (GroupViewHolder) convertView.getTag();
      }
  
      if (contactImage != null) {
          groupViewHolder.mContactImage.setImageBitmap(contactImage);
  
      } else {
          groupViewHolder.mContactImage
                  .setImageResource(R.drawable.default_contact);
      }
  
      groupViewHolder.mContactName.setText(contactName);
  
      return convertView;
  }
  
  @Override
  public int getChildrenCount(int groupPosition) {
      return mListDataChild.get(mListDataHeader.get(groupPosition).getName())
              .size();
  }
  
  @Override
  public ContactPhoneItems getChild(int groupPosition, int childPosition) {
      return mListDataChild.get(mListDataHeader.get(groupPosition).getName())
              .get(childPosition);
  }
  
  @Override
  public long getChildId(int groupPosition, int childPosition) {
      return childPosition;
  }
  
  @Override
  public View getChildView(int groupPosition, int childPosition,
          boolean isLastChild, View convertView, ViewGroup parent) {
  
      final String contactName = getGroup(groupPosition).getName();
      final int mChildPosition = childPosition;
  
      numberText = getChild(groupPosition, childPosition).getNumber();
      String typeText = getChild(groupPosition, childPosition).getPhoneType();
  
      mGetChecked = mChildCheckStates.get(contactName);
  
      if (convertView == null) {
  
          LayoutInflater inflater = (LayoutInflater) this.mContext
                  .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          convertView = inflater.inflate(R.layout.contact_detail_item, null);
  
          childViewHolder = new ChildViewHolder();
  
          childViewHolder.mPhoneNumber = (TextView) convertView
                  .findViewById(R.id.tv_phone_number);
  
          childViewHolder.mPhoneType = (TextView) convertView
                  .findViewById(R.id.tv_phone_type);
  
          childViewHolder.mCheckBox = (CheckBox) convertView
                  .findViewById(R.id.checkBox);
  
          convertView.setTag(R.layout.contact_detail_item, childViewHolder);
  
      } else {
  
          childViewHolder = (ChildViewHolder) convertView
                  .getTag(R.layout.contact_detail_item);
      }
  
      childViewHolder.mPhoneNumber.setText(numberText);
      childViewHolder.mPhoneType.setText(typeText);
  
      childViewHolder.mCheckBox.setChecked(mGetChecked[mChildPosition]);
      childViewHolder.mCheckBox.setOnClickListener(new OnClickListener() {
  
          @Override
          public void onClick(View v) {
  
              boolean isChecked = childViewHolder.mCheckBox.isChecked();
  
              Log.d("Debug", "isChecked = " + String.valueOf(isChecked));
  
              if (isChecked) {
  
                  selectedNumbers.add(numberText);
  
              } else {
  
                  selectedNumbers.remove(numberText);
              }
  
              childViewHolder.mCheckBox.setChecked(isChecked);
  
              mGetChecked[mChildPosition] = isChecked;
              mChildCheckStates.put(contactName, mGetChecked);
          }
      });
  
      return convertView;
  }
  
  @Override
  public boolean isChildSelectable(int groupPosition, int childPosition) {
      return false;
  }
  
  @Override
  public boolean hasStableIds() {
      return false;
  }
  
  public ArrayList&lt;String&gt; getSelectedNumbers() {
  
      return selectedNumbers;
  
  }
  
  public final class GroupViewHolder {
  
      TextView mContactName;
      ImageView mContactImage;
  }
  
  public final class ChildViewHolder {
  
      TextView mPhoneNumber;
      TextView mPhoneType;
      CheckBox mCheckBox;
  }
  
  @Override
  public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
      // TODO Auto-generated method stub
      Log.d("Debug", "onCheckChangedListener : " + String.valueOf(isChecked));
  }
  </code></pre>
  
  <p>}</p>