title: Checkbox in ExpandableListView
body: <p>I am using an <code>ExpandableListView</code> in which each group is a <code>TextView</code> and each child is a <code>CheckBox</code>. I was trying to implement something similar to this link :</p>
  
  <p><a href="http://www.vogella.de/articles/AndroidListView/article.html#listadvanced_interactive" rel="noreferrer">http://www.vogella.de/articles/AndroidListView/article.html#listadvanced_interactive</a> </p>
  
  <p>but with a <code>ExpandableListView</code> instead of <code>ListView</code>.
  At runtime, it is giving a strange <code>ClassCastException</code> while setting the <code>Tag</code> for the checkbox  using <code>setTag()</code>. Here is the code :</p>
  
  <pre><code>public class ExpandableActivity extends Activity {
  
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
  
      ArrayList&lt;String&gt; groups = new ArrayList&lt;String&gt;();
      List&lt;List&lt;OptionItem&gt;&gt; children = new ArrayList&lt;List&lt;OptionItem&gt;&gt;();
  
      for (int i = 0; i &lt; 10; i++) {
          String groupName = "Group " + i;
          groups.add(groupName);
          List&lt;OptionItem&gt; temp = new ArrayList&lt;OptionItem&gt;();
          for (int j = 0; j &lt; 5; j++) {
              temp.add(new OptionItem(groupName, "Child " + j));
          }
          children.add(temp);
      }
  
      children.get(0).get(3).setSelected(true);
      children.get(5).get(2).setSelected(true);
      children.get(8).get(1).setSelected(true);
      children.get(3).get(4).setSelected(true);
  
      ExpandableListView elv = (ExpandableListView) findViewById(R.id.expandableListView1);
      elv.setAdapter(new ExpandableAdapter(groups, children));
  
  }
  
  public static class ViewHolder {
      protected CheckBox cb;
  }
  
  public class ExpandableAdapter extends BaseExpandableListAdapter {
  
      private List&lt;List&lt;OptionItem&gt;&gt; list;
      private ArrayList&lt;String&gt; groups;
  
      public ExpandableAdapter(ArrayList&lt;String&gt; groups,
              List&lt;List&lt;OptionItem&gt;&gt; children) {
          this.groups = groups;
          this.list = children;
      }
  
      @Override
      public Object getChild(int groupPosition, int childPosition) {
          if (list != null &amp;&amp; list.size() &gt; groupPosition
                  &amp;&amp; list.get(groupPosition) != null) {
              if (list.get(groupPosition).size() &gt; childPosition)
                  return list.get(groupPosition).get(childPosition);
          }
  
          return null;
      }
  
      @Override
      public long getChildId(int groupPosition, int childPosition) {
          return childPosition;
      }
  
      @Override
      public View getChildView(final int groupPosition,
              final int childPosition, boolean isLastChild, View convertView,
              ViewGroup parent) {
  
          View view = null;
          if (convertView == null) {
              view = getLayoutInflater().inflate(R.layout.row, null);
              final ViewHolder childHolder = new ViewHolder();
              childHolder.cb = (CheckBox) view.findViewById(R.id.checkBox1);              
              childHolder.cb
                      .setOnCheckedChangeListener(new OnCheckedChangeListener() {
                          @Override
                          public void onCheckedChanged(CompoundButton button,
                                  boolean isChecked) {
                              OptionItem item = (OptionItem) childHolder.cb
                                      .getTag();
                              item.setSelected(button.isChecked());
                          }
                      });
  
              view.setTag(childHolder);
              childHolder.cb.setTag(list.get(groupPosition).get(childPosition));
          } else {
              view = convertView;         
              ((ViewHolder) view.getTag()).cb.setTag(list.get(groupPosition).get(childPosition));
          }
  
          ViewHolder holder = (ViewHolder) view.getTag();
          holder.cb.setChecked(list.get(groupPosition).get(childPosition)
                  .isSelected());
          holder.cb.setText(list.get(groupPosition).get(childPosition)
                  .getChildName());
  
          return view;
      }
  
      @Override
      public int getChildrenCount(int groupPosition) {
          if (list != null &amp;&amp; list.size() &gt; groupPosition
                  &amp;&amp; list.get(groupPosition) != null)
              return list.get(groupPosition).size();
  
          return 0;
      }
  
      @Override
      public Object getGroup(int groupPosition) {
          if (groups != null &amp;&amp; groups.size() &gt; groupPosition)
              return groups.get(groupPosition);
  
          return null;
      }
  
      @Override
      public int getGroupCount() {
          if (groups != null)
              return groups.size();
  
          return 0;
      }
  
      @Override
      public long getGroupId(int groupPosition) {
          return groupPosition;
      }
  
      @Override
      public View getGroupView(int groupPosition, boolean isExpanded,
              View convertView, ViewGroup parent) {
          if (convertView == null) {
              convertView = getLayoutInflater().inflate(
                      android.R.layout.simple_expandable_list_item_1, null);
          }
  
          TextView tv = (TextView) convertView
                  .findViewById(android.R.id.text1);
          tv.setText(groups.get(groupPosition));
  
          return convertView;
      }
  
      @Override
      public boolean hasStableIds() {
          return true;
      }
  
      @Override
      public boolean isChildSelectable(int groupPosition, int childPosition) {
          return true;
      }
  }
  </code></pre>
  
  <p>and the data model class :</p>
  
  <pre><code>public class OptionItem {
  
  private String groupName;
  private String childName;
  private boolean selected;
  
  public OptionItem(String group, String child) {
  
      this.groupName = group;
      this.childName = child;
      selected = false;
  }
  
  public void setGroupName(String name) {
      this.groupName = name;
  }
  
  public void setChildName(String name) {
      this.childName = name;
  }
  
  public void setSelected(boolean selected) {
      this.selected = selected;
  }
  
  public String getGroupName() {
      return groupName;
  }
  
  public String getChildName() {
      return childName;
  }
  
  public boolean isSelected() {
      return selected;
  }
  </code></pre>
  
  <p>Please help. Thanks in advance.</p>
  
  <p><strong>EDIT</strong> : The log is as follows:</p>
  
  <pre><code>  02-15 12:40:03.224: E/AndroidRuntime(423): FATAL EXCEPTION: main
  02-15 12:40:03.224: E/AndroidRuntime(423): java.lang.ClassCastException: com.test.OptionItem
  02-15 12:40:03.224: E/AndroidRuntime(423):  at com.test.ExpandableActivity$ExpandableAdapter.getChildView(ExpandableActivity.java:106)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.widget.ExpandableListConnector.getView(ExpandableListConnector.java:450)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.widget.AbsListView.obtainView(AbsListView.java:1315)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.widget.ListView.makeAndAddView(ListView.java:1727)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.widget.ListView.fillDown(ListView.java:652)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.widget.ListView.fillSpecific(ListView.java:1284)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.widget.ListView.layoutChildren(ListView.java:1558)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.widget.AbsListView.onLayout(AbsListView.java:1147)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.view.View.layout(View.java:7035)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1042)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.view.View.layout(View.java:7035)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.view.View.layout(View.java:7035)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1042)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.view.View.layout(View.java:7035)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.view.View.layout(View.java:7035)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1045)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.os.Handler.dispatchMessage(Handler.java:99)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.os.Looper.loop(Looper.java:123)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at android.app.ActivityThread.main(ActivityThread.java:4627)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at java.lang.reflect.Method.invokeNative(Native Method)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at java.lang.reflect.Method.invoke(Method.java:521)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
  02-15 12:40:03.224: E/AndroidRuntime(423):  at dalvik.system.NativeStart.main(Native Method)
  </code></pre>
  
  <p>EDIT: I have tried it again, it is still giving the same exception. Here are the imports I have added:</p>
  
  <pre><code>import java.util.ArrayList;
  import java.util.List;
  import android.app.Activity;
  import android.os.Bundle;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.BaseExpandableListAdapter;
  import android.widget.CheckBox;
  import android.widget.CompoundButton;
  import android.widget.CompoundButton.OnCheckedChangeListener;
  import android.widget.ExpandableListView;
  import android.widget.TextView;
  </code></pre>