'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 |
|---|
