在这里,你可以看到我有一个plist,当用户单击select all按钮时,我正在获取选中的复选框。 但是这里是,当我显示数据列表时,只有那些在屏幕上可见的复选框的数据,当我向下滚动时,剩余的复选框被选中,当我再滚动一些时间时,它又一次重复选中的复选框的值
Adapter.java
public class AttendanceRegisterAdapter extends RecyclerView.Adapter<AttendanceRegisterAdapter.AttendanceViewHolder> {
Context context;
private ArrayList<Student> student;
private boolean isSelectedAll;
private ArrayList<String> plist = new ArrayList<>();
public AttendanceRegisterAdapter(Context context, ArrayList<Student> student) {
this.context = context;
this.student = student;
}
@NonNull
@Override
public AttendanceViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.template_card_student, parent, false);
return new AttendanceViewHolder(view);
}
public void selectAll() {
isSelectedAll = true;
notifyDataSetChanged();
}
public void unSelectAll() {
isSelectedAll = false;
notifyDataSetChanged();
}
@Override
public void onBindViewHolder(@NonNull AttendanceViewHolder holder, int position) {
final Student selectedList = student.get(position);
holder.cbAttendance.setSelected(selectedList.getSelected());
holder.cbAttendance.setTag(position);
if (isSelectedAll) {
selectedList.setSelected(true);
plist.add(student.get(position).getStudentID());
} else {
selectedList.setSelected(false);
plist.remove(student.get(position).getStudentID());
}
holder.cbAttendance.setChecked(selectedList.getSelected());
}
@Override
public int getItemCount() {
return student.size();
}
class AttendanceViewHolder extends RecyclerView.ViewHolder {
CardView cvStudentCard;
ImageView imgStudentPicture;
TextView txtStudentName;
CheckBox cbAttendance;
public AttendanceViewHolder(@NonNull View itemView) {
super(itemView);
cvStudentCard = itemView.findViewById(R.id.card_student_view);
imgStudentPicture = itemView.findViewById(R.id.img_student_picture);
txtStudentName = itemView.findViewById(R.id.tv_card_title);
cbAttendance = itemView.findViewById(R.id.cb_attendance);
}
}
}
您在BindViewHolder中添加StudentId而不检查plist,可能每次调用BindViewHolder时都会添加重复的值。
public class AttendanceRegisterAdapter extends RecyclerView.Adapter<AttendanceRegisterAdapter.AttendanceViewHolder> {
Context context;
private ArrayList<Student> student;
private boolean isSelectedAll;
private ArrayList<String> plist = new ArrayList<>();
public AttendanceRegisterAdapter(Context context, ArrayList<Student> student) {
this.context = context;
this.student = student;
}
@NonNull
@Override
public AttendanceViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.template_card_student, parent, false);
return new AttendanceViewHolder(view);
}
public void selectAll() {
isSelectedAll = true;
notifyDataSetChanged();
}
public void unSelectAll() {
isSelectedAll = false;
notifyDataSetChanged();
}
public Boolean checkElementExist(String element) {
return plist.contains(element);
}
@Override
public void onBindViewHolder(@NonNull AttendanceViewHolder holder, int position) {
final Student selectedList = student.get(position);
holder.cbAttendance.setSelected(selectedList.getSelected());
holder.cbAttendance.setTag(position);
if (isSelectedAll) {
selectedList.setSelected(true);
if (!checkElementExist(student.get(position).getStudentID())) {
plist.add(student.get(position).getStudentID());
}
} else {
selectedList.setSelected(false);
plist.remove(student.get(position).getStudentID());
}
holder.cbAttendance.setChecked(selectedList.getSelected());
}
@Override
public int getItemCount() {
return student.size();
}
class AttendanceViewHolder extends RecyclerView.ViewHolder {
CardView cvStudentCard;
ImageView imgStudentPicture;
TextView txtStudentName;
CheckBox cbAttendance;
public AttendanceViewHolder(@NonNull View itemView) {
super(itemView);
cvStudentCard = itemView.findViewById(R.id.card_student_view);
imgStudentPicture = itemView.findViewById(R.id.img_student_picture);
txtStudentName = itemView.findViewById(R.id.tv_card_title);
cbAttendance = itemView.findViewById(R.id.cb_attendance);
}
}
}