Java 在ListView滚动上重置复选框

Java 在ListView滚动上重置复选框,java,android,Java,Android,我的问题是,当我在列表视图中滚动时,信息会被更新,导致复选框被重置。我需要能够调用allChecked()函数来查看是否选中了所有复选框,但我无法这样做,因为状态正在重置。如何使状态持久化 这是我处理列表视图的自定义addpter public class CustomAdapter extends ArrayAdapter { private ArrayList<DataModel> dataSet; Context mContext; // View lookup cache

我的问题是,当我在列表视图中滚动时,信息会被更新,导致复选框被重置。我需要能够调用allChecked()函数来查看是否选中了所有复选框,但我无法这样做,因为状态正在重置。如何使状态持久化

这是我处理列表视图的自定义addpter

public class CustomAdapter extends ArrayAdapter {

private ArrayList<DataModel> dataSet;
Context mContext;

// View lookup cache
private static class ViewHolder {
    TextView txtName;
    CheckBox checkBox;
}

public CustomAdapter(ArrayList data, Context context) {
    super(context, R.layout.row_item, data);
    this.dataSet = data;
    this.mContext = context;

}
@Override
public int getCount() {
    return dataSet.size();
}

@Override
public DataModel getItem(int position){
    return dataSet.get(position);
}


@Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) {

    ViewHolder viewHolder;
    View result;

    if (convertView == null) {
        viewHolder = new ViewHolder();
        convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item, parent, false);
        viewHolder.txtName = (TextView) convertView.findViewById(R.id.txtName);
        viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);


        result=convertView;
        convertView.setTag(viewHolder);

    } else {
        viewHolder = (ViewHolder) convertView.getTag();
        result=convertView;
    }
    DataModel item = getItem(position);

    viewHolder.txtName.setText(item.toDo);
    viewHolder.checkBox.setChecked(item.checked);


    return result;
 }
}
列表的xml文件以防万一

   <TextView
    android:id="@+id/txtName"
    android:layout_width="402dp"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_centerVertical="true"
    android:padding="30dp"
    android:textColor="@color/GbzBlack"
    android:textSize="24sp" />

<CheckBox
    android:id="@+id/checkBox"
    style="@style/Widget.AppCompat.CompoundButton.CheckBox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentEnd="true"
    android:layout_centerVertical="true" />
更新

改变

  viewHolder.checkBox.setChecked(item.checked)


使复选框保持选中状态。但是,选中第一个复选框后,最后一个复选框也将变为选中状态。创建一个arraylist,该arraylist可以为listview中的每个案例保存一个布尔值。选中该框后,为每个结果保存一个布尔值,说明是否选中了该框。因此,当您在创建每个视图之前创建列表视图时,请检查视图布尔值是否为true或false,并将框设置为checked/unchecked。

谢谢您的想法,主要解决方法是将Nigel Brown所说的内容与数组合并,以及在类内部而不是外部创建onclicklistner本文中的代码与您的问题非常相似
   if (formTitle == "215CANNA") {
        Spinner tmpSpinner = findViewById(R.id.bayNameSpinner5);
        TextView tmpTextView = findViewById(R.id.bayNamesText5);
        tmpSpinner.setVisibility(View.INVISIBLE);
        tmpTextView.setVisibility(View.INVISIBLE);

        //bay 1
        myAdapter = new CustomAdapter(cannaGinB1, getApplicationContext());
        myListView.setAdapter(myAdapter);

        if (allChecked) {
            nextAndExportBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    buttonCounter++;
                    //bay 2
                    if (buttonCounter == 1) {
                        myAdapter = new CustomAdapter(cannaGinB2, getApplicationContext());
                        myListView.setAdapter(myAdapter);
                    }
                    //bay 3
                    if (buttonCounter == 2) {
                        myAdapter = new CustomAdapter(cannaGinB3, getApplicationContext());
                        myListView.setAdapter(myAdapter);
                    }
                    //bay 4
                    if (buttonCounter == 3) {
                        myAdapter = new CustomAdapter(cannaGinB4, getApplicationContext());
                        myListView.setAdapter(myAdapter);
                        nextAndExportBtn.setText("Export");
                    }

                }
            });
        }

        myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView parent, View view, int position, long id) {
                myAdapter.notifyDataSetChanged();
                totalChecked++;
                int listSize = myListView.getCount();
                if (listSize == totalChecked){
                    allChecked = true;
                }
            }
        });
  viewHolder.checkBox.setChecked(item.checked)
 viewHolder.checkBox.setTag(item.checked)