其他分享
首页 > 其他分享> > android-ExpandableListView子项的CheckBox被随机检查

android-ExpandableListView子项的CheckBox被随机检查

作者:互联网

我创建了一个带有相当复杂的子项xml的ExpandableListView.它包含一个TextView,一个复选框和一个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>

如果我检查第一个项目,则在每个组中也会检查第五个项目(如果选择了第二个项目,则选择第六个项目).

为什么还要选择它们?

更新:

在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检查,则不会重用该复选框,但是如果我滚动出去,则选中的复选框也会被取消选中.

解决方法:

这是因为视图的回收.

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

编辑:

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

因此,为防止这种情况发生,您必须保存选中的位置,并且在getChildView()方法上应基于保存的值选中/取消选中复选框.

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

标签:android-layout,expandablelistview,android
来源: https://codeday.me/bug/20191122/2062670.html