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