3

我创建了一个带有非常复杂的子项 xml 的 ExpandableListView。它包含一个 TextView、一个 Checkbox 和一个 EditText。这是 CheckBox 部分:

 <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
               android:layout_width="match_parent"
               android:layout_height="55dip"
               android:orientation="horizontal"
               android:stretchColumns="0">
  <TableRow>
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal"
  >
  <TextView
      android:id="@+id/lblListItem"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:textSize="14dip"
      android:paddingTop="2dp"
      android:paddingBottom="2dp"
      android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft"/>
  <CheckBox
      android:id="@+id/cboxIsRel"
      android:layout_width="wrap_content"
            android:layout_height="wrap_content">

  </CheckBox>
  </TableRow>
  </TableLayout>

如果我检查第 1 项,则在每个组中,也会检查第 5 项(如果选择了第 2 项,则选择第 6 项)。

为什么他们也会被选中?

更新:

getChildView方法中我有这个代码:

if (convertView == null)
{
  LayoutInflater infalInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  convertView = infalInflater.inflate(R.layout.expandable_list_item, null);
}
TextView txtListChild = (TextView) convertView.findViewById(R.id.lblListItem);
txtListChild.setText(childText);

如果我不使用 convertView 检查,则不会重复使用该复选框,但如果我滚动出去,选定的复选框也会被取消选中。

4

1 回答 1

3

这是因为视图的回收。

确保在您的适配器上,bindView() 或 getView() 方法将复选框设置为选中或不选中。

编辑:

ListView 重用视图以提高性能,因此在您的情况下,检查第一个项目,然后在第 5 个孩子上使用相同的视图,所以它也被检查。

因此,为防止这种情况发生,您必须保存选中的位置,并在 getChildView() 方法中根据保存的值选中/取消选中复选框。

这样,您检查第 1 项,然后滚动并将视图回收到第 5 个子项,适配器将为位置 5 调用 getChildView 并且您将检查它是否已被检查。由于未选中,因此您在复选框上调用 setchecked(false) ,它将显示为未选中。

于 2013-09-05T13:28:56.170 回答