'Cannot call this method while RecyclerView is computing a layout or scrolling androidx.recyclerview.widget.RecyclerView

I have a recyclerview with check boxes and names, After checking the desirable checkboxes I want a list of them but the recyclerView recycles the items on scroll, So I wanted to update the particular item in the adapter but this error occurss

java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling androidx.recyclerview.widget.RecyclerView{478bf18 VFED..... ......ID 0,0-1080,2110 #7f09023a app:id/student_attendance_RV}, adapter:com.dtech.lecturer.ui.adapter.attendance.AttendanceAdapter@632dd71, layout:androidx.recyclerview.widget.LinearLayoutManager@986e756, context:dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper@b5e0397
        at androidx.recyclerview.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:3051)
        at androidx.recyclerview.widget.RecyclerView$RecyclerViewDataObserver.onItemRangeChanged(RecyclerView.java:5547)
        at androidx.recyclerview.widget.RecyclerView$AdapterDataObservable.notifyItemRangeChanged(RecyclerView.java:12268)
        at androidx.recyclerview.widget.RecyclerView$Adapter.notifyItemChanged(RecyclerView.java:7398)

Here is my recycler view code

          val adapter = AttendanceAdapter()
          adapter.setOnAttendanceCheckedLister(object : ClickListener {
                override fun onCheckedListener(position: Int, copy: AttendanceStudent) {
                    adapter.notifyItemChanged(position, copy)
                }
            })
            studentAttendanceRV.adapter = adapter
            viewModel.studentList.observe(viewLifecycleOwner) {
                   adapter.submitList(it)
            }

And here is my Adapter Code


class AttendanceAdapter :
    ListAdapter<AttendanceStudent, AttendanceAdapter.ViewHolder>(DiffCallback()) {

    private lateinit var listener: ClickListener

    fun setOnAttendanceCheckedLister(listener: ClickListener) {
        this.listener = listener
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding: ItemAttendanceBinding =
            ItemAttendanceBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return ViewHolder(binding)
    }

    inner class ViewHolder(private val binding: ItemAttendanceBinding) :
        RecyclerView.ViewHolder(binding.root) {
        fun bind(item: AttendanceStudent, position: Int) {
            binding.apply {
                studentRoll.text = item.roll_no
                studentName.text = item.student_name
                presentBox.isChecked = item.isPresent
                presentBox.setOnCheckedChangeListener { _, b ->
                    listener.onCheckedListener(position, item.copy(isPresent = b))
                }
            }
        }
    }

    override fun onBindViewHolder(holder: AttendanceAdapter.ViewHolder, position: Int) {
        holder.bind(getItem(position), position)
    }

    class DiffCallback : DiffUtil.ItemCallback<AttendanceStudent>() {
        override fun areItemsTheSame(
            oldItem: AttendanceStudent,
            newItem: AttendanceStudent
        ): Boolean {
            return oldItem.id == newItem.id
        }

        override fun areContentsTheSame(
            oldItem: AttendanceStudent,
            newItem: AttendanceStudent
        ): Boolean =
            oldItem == newItem
    }
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source