J'ai joint un écouteur onClick dans RecyclerView onBindViewHolder , je active l'état de la case à cocher sélectionnée, mais il renvoie l'erreur ci-dessous Les vues mises au rebut ou jointes ne peuvent pas être recyclées Il n'y a qu'une seule case à cocher dans le ViewHolder le
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)
il lance cette erreur
override fun onBindViewHolder(holder: BookingSlotListItemViewHolder, position: Int) {
holder.timeSlot.setOnClickListener { view: View? ->
holder.timeSlot.toggle()
}
}
3 Réponses :
Essayez d'utiliser
override fun onBindViewHolder(holder: BookingSlotListItemViewHolder, position: Int) {
holder.timeSlot.setOnClickListener { view: View? ->
if (view is CheckBox) {
view.toggle()
}
}
}
à la place.
utilisez setOnCheckListener au lieu de setOnClickListener .
ou essayez ceci
mGridLayoutManager.setItemPrefetchEnabled(false);
Essayez de définir OnClickListener dans la fonction d'initialisation de ViewHolder.
Avez-vous
android: animateLayoutChanges = truesur le RecyclerView dans votre fichier de mise en page?non il n'y a pas d'attribut android: animateLayoutChanges, j'anime dans l'androïde dessinable: stateListAnimator
utilisez simplement setCheckedChangeListener si vous souhaitez basculer au lieu de seOnClickListener