繁体   English   中英

在回收站视图中滚动时,它向选定的复选框列表添加了一些其他值

[英]while scrolling in recycler view it added some other values to the selected list of checkboxes

在这里,您可以看到我有一个 plist,当用户单击select all按钮时,我在其中获取选定的复选框。

这是当我显示数据列表时。 只有那些复选框的数据在屏幕上可见,当我向下滚动时,剩余的复选框被选中,当我再滚动一段时间时,它会重复选定复选框的另一个值

适配器.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);
    }
    
    public void selectLeftOver(int nextPosition) {
        for (int i = nextPosition; nextPosition > getItemCount(); i++) {
            if (!checkElementExist(student.get(i).getStudentID())) {
                plist.add(student.get(i).getStudentID());
                }
        }
    }

    @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());
                selectLeftOver(position + 1);
                }
            
        } else {
            selectedList.setSelected(false);
            if (!checkElementExist(student.get(position).getStudentID())) {
                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);


        }
    
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM