OK200
OK200

Reputation: 757

When clicking any RecyclerView item its giving error

I have attached an onClick listener in RecyclerView onBindViewHolder, I'm toggling the checkbox selected state but it's throwing the below error Scrapped or attached views may not be recycled

There is only one checkbox in the ViewHolder the

override fun onBindViewHolder(holder: BookingSlotListItemViewHolder, position: Int) { 
    holder.timeSlot.setOnClickListener {  view: View? -> 
    holder.timeSlot.toggle()
  }
}

it's throwing this error

E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.debugapp.debug, PID: 24546
        java.lang.IllegalArgumentException: Scrapped or attached views may not be recycled. isScrap:false isAttached:true androidx.recyclerview.widget.RecyclerView{3bf1da4 VFED..... ........ 32,625-1016,767 #7f0a003b app:id/booking_slot_list}, adapter:com.debugapp.v2.bookings.BookingSlotListAdapter@43fc70d, layout:androidx.recyclerview.widget.LinearLayoutManager@edbe6c2, context:com.debugapp.v2.BookingActivity@6ec8476
            at androidx.recyclerview.widget.RecyclerView$Recycler.recycleViewHolderInternal(RecyclerView.java:6159)
            at androidx.recyclerview.widget.RecyclerView.removeAnimatingView(RecyclerView.java:1451)
            at androidx.recyclerview.widget.RecyclerView$ItemAnimatorRestoreListener.onAnimationFinished(RecyclerView.java:12454)
            at androidx.recyclerview.widget.RecyclerView$ItemAnimator.dispatchAnimationFinished(RecyclerView.java:12954)
            at androidx.recyclerview.widget.SimpleItemAnimator.dispatchMoveFinished(SimpleItemAnimator.java:292)
            at androidx.recyclerview.widget.DefaultItemAnimator.animateMove(DefaultItemAnimator.java:264)
            at androidx.recyclerview.widget.DefaultItemAnimator.animateChange(DefaultItemAnimator.java:324)
            at androidx.recyclerview.widget.SimpleItemAnimator.animateChange(SimpleItemAnimator.java:161)
            at androidx.recyclerview.widget.RecyclerView.animateChange(RecyclerView.java:4186)
            at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep3(RecyclerView.java:3984)
            at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3652)
            at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4194)
            at android.view.View.layout(View.java:20831)
            at android.view.ViewGroup.layout(ViewGroup.java:6203)
            at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1915)
            at android.view.View.layout(View.java:20831)
            at android.view.ViewGroup.layout(ViewGroup.java:6203)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
            at android.view.View.layout(View.java:20831)
            at android.view.ViewGroup.layout(ViewGroup.java:6203)
            at androidx.recyclerview.widget.RecyclerView$LayoutManager.layoutDecoratedWithMargins(RecyclerView.java:9322)
            at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1615)
            at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
            at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
            at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924)
            at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3336)
            at android.view.View.measure(View.java:23355)
            at androidx.constraintlayout.widget.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:1227)
            at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1572)
            at android.view.View.measure(View.java:23355)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6758)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
            at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
            at android.view.View.measure(View.java:23355)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6758)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
            at android.view.View.measure(View.java:23355)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6758)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
            at android.view.View.measure(View.java:23355)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6758)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)

Upvotes: 1

Views: 373

Answers (3)

NehaK
NehaK

Reputation: 2737

use setOnCheckListener instead of setOnClickListener.

or try this

mGridLayoutManager.setItemPrefetchEnabled(false);

Upvotes: 1

johnguild
johnguild

Reputation: 435

Try to set the OnClickListener inside the ViewHolder's init function.

Upvotes: 0

Tidder
Tidder

Reputation: 1214

Try to use

override fun onBindViewHolder(holder: BookingSlotListItemViewHolder, position: Int) { 
    holder.timeSlot.setOnClickListener {  view: View? -> 
        if (view is CheckBox) {
            view.toggle()
        }
    }
}

instead.

Upvotes: 1

Related Questions