【问题标题】:When clicking any RecyclerView item its giving error单击任何 RecyclerView 项目时,其给出错误
【发布时间】:2019-07-19 07:43:03
【问题描述】:

我在 RecyclerView onBindViewHolder 中附加了一个 onClick 侦听器,我正在切换复选框选中状态,但它抛出以下错误报废或附加的视图可能无法回收

ViewHolder中只有一个复选框

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

它抛出了这个错误

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)

【问题讨论】:

  • 你的布局文件中的 RecyclerView 上是否有android:animateLayoutChanges=true
  • 不,没有属性 android:animateLayoutChanges,我在可绘制的 android:stateListAnimator 中制作动画
  • 如果想要切换而不是 seOnClickListener,只需使用 setCheckedChangeListener

标签: android android-recyclerview


【解决方案1】:

尝试使用

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

改为。

【讨论】:

    【解决方案2】:

    使用setOnCheckListener 而不是setOnClickListener

    或者试试这个

    mGridLayoutManager.setItemPrefetchEnabled(false);
    

    【讨论】:

      【解决方案3】:

      尝试在 ViewHolder 的 init 函数中设置 OnClickListener。

      【讨论】:

        猜你喜欢
        • 2021-04-28
        • 1970-01-01
        • 2017-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-01
        • 2019-08-22
        相关资源
        最近更新 更多