Android ListView每隔10项重复复选框行为不规则

Android ListView每隔10项重复复选框行为不规则,android,listview,android-listview,arraylist,Android,Listview,Android Listview,Arraylist,我有一个列表视图,该视图由具有特定布局的CustomAdapter填充 ArrayList作为参数传递给此CustomAdapter,其中包含每个ListView元素的数据。 每个ListView元素由一个TextView(我在其中显示ArrayList中的数据)和它右侧的一个复选框组成 ArrayList中的数据是正确的。填充ListView时,此数据也会正确显示,并且不会在任何元素中重复(有关详细信息,请参见下面的图像) 问题:当列表视图填充并显示在屏幕上时,当我选中其中一个复选框时,每10

我有一个列表视图,该视图由具有特定布局的CustomAdapter填充
ArrayList作为参数传递给此CustomAdapter,其中包含每个ListView元素的数据。
每个ListView元素由一个TextView(我在其中显示ArrayList中的数据)和它右侧的一个复选框组成

ArrayList中的数据是正确的。填充ListView时,此数据也会正确显示,并且不会在任何元素中重复(有关详细信息,请参见下面的图像)

问题:当列表视图填充并显示在屏幕上时,当我选中其中一个复选框时,每10个元素下面也会选中另一个复选框(有关详细信息,请参见下面的图像)

在这些图像中,您可以看到,当我检查第一个元素时,第十个元素也被检查。当我检查第二个元素时,第十一个元素也被检查了
即使我检查最后一个元素,也会检查第三个元素

为什么会发生这种行为???

下面是CustomAdapter元素ContentAdapter.java的代码:

@SuppressWarnings("rawtypes")
public class ElementContentAdapter extends BaseAdapter implements OnClickListener {

private final Activity activity;
private final ArrayList elements;
private static LayoutInflater layoutInflater = null;


public ElementContentAdapter(Activity activity, ArrayList data) {
    this.activity = activity;
    this.elements = data;

    layoutInflater = (LayoutInflater) this.activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

public static class ViewHolder {
    public TextView tviContent;
}

@Override
public int getCount() {
    if (elements.size() <= 0) return 1;
    return elements.size();
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public Object getItem(int position) {
    return position;
}

@Override
public void onClick(View view) {
    //
}

@SuppressLint("InflateParams")
public View getView(int position, View convertView, ViewGroup parent) {

    final ViewHolder viewHolder;

    if (convertView== null) {
        convertView = layoutInflater.inflate(R.layout.element_content_checklist, null);

        viewHolder = new ViewHolder();
        viewHolder.tviContent = (TextView) convertView.findViewById(R.id.tvi_content_element_content_checklist);

        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    if (elements.size() <= 0) {
        /**
         * 
         */
    } else if(elements.size() > 0) {
        ElementContent currentElement = null;
        currentElement = (ElementContent) elements.get(position);

        viewHolder.tviContent.setText(currentElement.getContent());

        convertView.setOnClickListener(new ElementContentOnClickListener(position));
    }

    return convertView;
}

private class ElementContentOnClickListener implements OnClickListener {

    private int selectedPosition;

    ElementContentOnClickListener (int position) {
        selectedPosition = position;
    }

    @Override
    public void onClick(View view) {
        CatMenusActivity catMenusActivity = (CatMenusActivity) activity;
        catMenusActivity.elementoContentOnClick(selectedPosition);
    }

}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/White"
    android:paddingBottom="10dp"
    android:paddingRight="6dp"
    android:paddingTop="10dp" >

    <TextView
        android:id="@+id/tvi_content_element_content_checklist"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_marginRight="10dp"
        android:layout_toLeftOf="@+id/cbo_mark_element_content_checklist"
        android:gravity="left"
        android:text="@string/txt_content_element_content"
        android:textAllCaps="false"
        android:textColor="@color/DimGray"
        android:textSize="14sp"
        android:textStyle="normal" />

    <CheckBox
        android:id="@+id/cbo_mark_element_content_checklist"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:button="@drawable/content_bg_checkbox_content"
        android:checked="false" />

</RelativeLayout>
@SuppressWarnings(“rawtypes”)
公共类ElementContentAdapter扩展BaseAdapter实现OnClickListener{
私人最终活动;
私有最终数组列表元素;
私有静态LayoutInflater LayoutInflater=null;
public ElementContentAdapter(活动,ArrayList数据){
这个。活动=活动;
这个元素=数据;
layoutInflater=(layoutInflater)this.activity.getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
}
公共静态类视图持有者{
公共文本查看电视内容;
}
@凌驾
public int getCount(){

if(elements.size()将复选框添加到视图保持架并定义它
getView()
方法。 然后尝试使用SparseBooleanArray,在其中单击项时可以将其设置为true,并可以在刷新视图以进行更新时进行检查

SparseBooleanArray pba=new SparseBooleanArray();//this should be global
private class ElementContentOnClickListener implements OnClickListener {

    private int selectedPosition;

    ElementContentOnClickListener (int position) {
        selectedPosition = position;
        pba[position]=true;

    }

    @Override
    public void onClick(View view) {
        CatMenusActivity catMenusActivity = (CatMenusActivity) activity;
        catMenusActivity.elementoContentOnClick(selectedPosition);
    }

}
然后在您的
getView()
方法中..手动检查所选位置并相应地更新复选框

holder.checkBox.setChecked(pba[position]); // inside getView()

这就是行循环。您必须使复选框成为视图持有者的一部分,然后根据标记对其进行检查,该标记可以为每个索引单独维护,也可以作为
ElementContent
的一部分。点击复选框应能更改此标记,而不仅仅是视图。是的!!!这是一个非常有效的解决方案!!!但您有一个错误:它不是“ParseBooleanArray”,而是
SparseBooleanArray
(编辑您的答案)。在
ElementContentAdapter
的构造函数中,我使用与元素数组相同的大小初始化了布尔数组。然后,我创建了一个
OnCheckedChangeListener
,并将其分配给ViewHolder的复选框,用于在正确的位置更改布尔数组中的布尔值。最后,在
getView()中
method我从布尔数组中读取这个更改后的值,并用
setChecked()将其分配给复选框