提问者:小点点

在回收器视图中滚动时,它将一些其他值添加到选中的复选框列表中


在这里,你可以看到我有一个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);


        }
    
    }

}

共1个答案

匿名用户

您在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);


        }
    
    }

}