首页 > 解决方案 > 在android中滚动时自动取消选中recyclerview中的复选框

问题描述

我使用 recyclerview 适配器创建了一个视图来列出学生。我的问题是,当我滚动视图时,所有选中的复选框都会自动取消选中。这意味着状态正在发生变化。如何克服这个问题

在这里我分享了我的代码。请检查并提出解决方案。提前致谢。

class IndividualStudentSelectAdapter(private val context: Context,
                                 private var students: List<IndividualStudentBean>,
                                 private val checkBox1: CheckBox,
                                 private val individualStudentSelectionListener: IndividualStudentSelectionListener

)

: RecyclerView.Adapter<IndividualStudentSelectAdapter.ViewHolder>(){

companion object {
    val TAG: String = IndividualStudentSelectAdapter::class.java.simpleName
}

override fun onCreateViewHolder(p0: ViewGroup, p1: Int): IndividualStudentSelectAdapter.ViewHolder {
    return ViewHolder(LayoutInflater.from(context).inflate(R.layout.individual_student, p0, false))
}

override fun getItemCount(): Int {
    return students.size
}

override fun onBindViewHolder(p0: ViewHolder, p1: Int) {
    val user = students.get(p1)
    p0.bindView(p1)

    p0.binding.individualStudentBean = students[p1]

    if (user.getSelected()==true) {
        p0.checkbox2.isChecked = true

    } else {
        p0.checkbox2.isChecked = false

    }


    p0.checkbox2.setOnCheckedChangeListener { buttonView, isChecked ->
        if(isChecked)
        {
            // val individualStudentBean = IndividualStudentBean(user.empid,"","")
            Log.d("admnos",user.id)
            individualStudentSelectionListener.addDatas(user.id)
            user.setSelected(true)

        }else{
            individualStudentSelectionListener.removeDatas(user.id)
            user.setSelected(false)
        }
    }
    checkBox1.setOnCheckedChangeListener {
        buttonView, isChecked ->

        if (isChecked){
            for (item in students)
            {

                p0.checkbox2.isChecked = true

                item.setSelected(true)
                notifyDataSetChanged()
            }


        }else{
            for (item in students) {

                p0.checkbox2.isChecked = false
                
                item.setSelected(false)
                notifyDataSetChanged()
            }
        }
    }
}

fun updateDataset(students: List<IndividualStudentBean>) {
    this.students = students
    notifyDataSetChanged()
}


inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    var binding: IndividualStudentBinding = DataBindingUtil.bind(itemView)!!
    val checkbox2 = itemView.findViewById(R.id.cb_student) as CheckBox

    fun bindView(position: Int) {

      //  this.setIsRecyclable(false)
        binding.individualStudentBean = students[position]

        itemView.setOnClickListener {
            //students[position].selected = itemView.cb_student.isChecked

            if (context is IndividualStudentSelectActivity) {
                //context.onStudentSelected()
            }
            if (context is IndividualStudentSelectActivity) {
                //context.onStudentSelected()
            }
        }
    }
}

}

标签: androidkotlin

解决方案


在数据类中添加一个名为isChecked(名称取决于您的选择)的属性,然后在方法Student中添加此代码bindView

checkbox2.isChecked = students[adapterPosition].isChecked
checkbox2.setOnCheckedChangeListener { _, isChecked ->
   students[adapterPosition].isChecked = isChecked
}

推荐阅读