google / flexbox-layout

Flexbox for Android
Apache License 2.0
18.24k stars 1.79k forks source link

Flexbox crashes when redrawing items in RecyclerView - using deprecated measure? #546

Open neofusionlul opened 4 years ago

neofusionlul commented 4 years ago
java.lang.IllegalArgumentException: Called attach on a child which is not detached: ViewHolder{bf59244 position=0 id=-1, oldPos=-1, pLpos:-1 no parent} androidx.recyclerview.widget.RecyclerView{5180b78 GFED..... ......ID 0,0-1080,520 #7f0a0299 app:id/gift_tip_recycler}, layout:com.google.android.flexbox.FlexboxLayoutManager@38efab6, 
        at androidx.recyclerview.widget.RecyclerView$5.attachViewToParent(RecyclerView.java:920)
        at androidx.recyclerview.widget.ChildHelper.attachViewToParent(ChildHelper.java:239)
        at androidx.recyclerview.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:8582)
        at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8559)
        at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8547)
        at com.google.android.flexbox.FlexboxLayoutManager.layoutFlexLineMainAxisHorizontal(FlexboxLayoutManager.java:1513)
        at com.google.android.flexbox.FlexboxLayoutManager.layoutFlexLine(FlexboxLayoutManager.java:1434)
        at com.google.android.flexbox.FlexboxLayoutManager.fill(FlexboxLayoutManager.java:1286)
        at com.google.android.flexbox.FlexboxLayoutManager.onLayoutChildren(FlexboxLayoutManager.java:754)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
        at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3540)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at android.view.View.measure(View.java:25086)
        at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:806)
        at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measureChildren(BasicMeasure.java:111)
        at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.simpleSolverMeasure(BasicMeasure.java:192)
        at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:102)
        at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1556)
        at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1588)
        at android.view.View.measure(View.java:25086)
        at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:806)
        at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measureChildren(BasicMeasure.java:111)
        at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.simpleSolverMeasure(BasicMeasure.java:192)
        at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:102)
        at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1556)
        at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1588)
        at android.view.View.measure(View.java:25086)
        at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:806)
        at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measureChildren(BasicMeasure.java:111)
        at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.simpleSolverMeasure(BasicMeasure.java:192)
        at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:102)
        at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1556)
        at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1588)
        at android.view.View.measure(View.java:25086)
        at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:806)
        at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measureChildren(BasicMeasure.java:111)
2020-04-17 12:24:10.651 13283-13283/ E/AndroidRuntime:     at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.simpleSolverMeasure(BasicMeasure.java:192)
        at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:102)
        at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1556)
        at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1588)
        at android.view.View.measure(View.java:25086)
        at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:806)
        at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measureChildren(BasicMeasure.java:111)
        at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.simpleSolverMeasure(BasicMeasure.java:192)
        at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:102)
        at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1556)
        at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1588)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at android.view.View.measure(View.java:25086)
        at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1638)
        at android.view.View.measure(View.java:25086)
        at androidx.constraintlayout.widget.ConstraintLayout$Measurer.deprecatedMeasure(ConstraintLayout.java:865)
        at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.simpleSolverMeasure(BasicMeasure.java:232)
        at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:102)
        at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1556)
        at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1588)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at com.android.internal.policy.DecorView.onMeasure(DecorView.java:742)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3083)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1857)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2146)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1745)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7768)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:967)
        at android.view.Choreographer.doCallbacks(Choreographer.java:791)
        at android.view.Choreographer.doFrame(Choreographer.java:726)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:952)
2020-04-17 12:24:10.651 13283-13283/E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Issues and steps to reproduce

I have two views in a ViewSwitcher, one is a RecyclerView using Flexbox, one is just a ConstraintLayout. Whenever I swap between the ConstraintLayout BACK to the RecyclerView, Flexbox encounters an exception trying to redraw the items in the RecyclerView. See attached exception.

Expected behavior

The RecyclerView should be able to redraw the views within the flexbox

Version of the flexbox library

2.0.1

Link to code

@Override
    public void showRecyclerView() {
        if (viewSwitcher.getCurrentView() == constraintLayout) {
            viewSwitcher.showNext();
        }
    }

    @Override
    public void showConstraintLayout() {
        if (viewSwitcher.getCurrentView() == recyclerView) {
            viewSwitcher.showNext();
        }
    }
Canato commented 3 years ago

Any news on this? @neofusionlul

Canato commented 3 years ago

@bcoulston-triller sorry to disturb you once more, how are you cleaning the adapter? Just so I don't do something like, make null and don't have the same effect

neofusionlul commented 3 years ago

Ah, sorry, got mixed up on accounts. I'm actually clearing the backing data structure for the adapter and calling notifyDataSetChanged

Haven't tried setting the adapter to null.