0

I'm trying to animate clearing of recyclerview. For adapter I use ListAdapter, and to make animation happen I simply submit empty list when needed, layout manager is grid with span of 5, recycler view is placed inside ConstraintLayout and have match_parent width and constant height. I've tried to override both animateRemove and animateDisappearance, also tried to add viewholders to array and use runPendingAnimations to run animations together but this crash still happens. For animation I just inflate simple Animation resource, almost the same animation I use in animateAdd, which works great

This is log from animator before crash, is it odd? Do you have any ideas why this could happen? From what I've found people face the same crash when they try to remove view from parent during animation, but in this case I just run animation, no removing from my side

enter image description here

java.lang.NullPointerException: Attempt to read from field 'int android.view.View.mViewFlags' on a null object reference
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4192)
    at android.view.View.updateDisplayListIfDirty(View.java:20843)
    at android.view.View.draw(View.java:21707)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4432)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4193)
    at androidx.constraintlayout.widget.ConstraintLayout.dispatchDraw(ConstraintLayout.java:2023)
    at android.view.View.updateDisplayListIfDirty(View.java:20843)
    at android.view.View.draw(View.java:21707)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4432)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4193)
    at androidx.constraintlayout.widget.ConstraintLayout.dispatchDraw(ConstraintLayout.java:2023)
    at android.view.View.updateDisplayListIfDirty(View.java:20843)
    at android.view.View.draw(View.java:21707)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4432)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4193)
    at android.view.View.draw(View.java:21978)
    at android.view.View.updateDisplayListIfDirty(View.java:20852)
    at android.view.View.draw(View.java:21707)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4432)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4193)
    at android.view.View.updateDisplayListIfDirty(View.java:20843)
    at android.view.View.draw(View.java:21707)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4432)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4193)
    at android.view.View.updateDisplayListIfDirty(View.java:20843)
    at android.view.View.draw(View.java:21707)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4432)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4193)
    at android.view.View.updateDisplayListIfDirty(View.java:20843)
    at android.view.View.draw(View.java:21707)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4432)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4193)
    at android.view.View.draw(View.java:21978)
    at com.android.internal.policy.DecorView.draw(DecorView.java:808)
    at android.view.View.updateDisplayListIfDirty(View.java:20852)
    at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:581)
    at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:587)
    at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:664)
    at android.view.ViewRootImpl.draw(ViewRootImpl.java:3767)
    at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3495)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2779)
    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)
    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)
2020-09-17 16:14:40.115 I/Process: Sending signal. PID: 9136 SIG: 9

Edit: Link to github sample project: https://github.com/SYtor/Animator-Crash-Test/blob/master/app/src/main/java/com/example/crashtest/MyAnimator.kt

Yaroslav Shulyak
  • 151
  • 1
  • 12
  • post some code how and when you are creating and starting these anims – snachmsm Sep 17 '20 at 14:11
  • @snachmsm updated post with link to sample project that reproduces this crash – Yaroslav Shulyak Sep 17 '20 at 15:02
  • Possibly related: https://stackoverflow.com/questions/33242776/android-viewgroup-crash-attempt-to-read-from-field-int-android-view-view-mview?answertab=votes#tab-top – JensV Sep 17 '20 at 15:20
  • personally I don't have a clue, but according to JensV link: you shoudn't call `dispatchRemoveFinished` straight inside `onAnimationEnd`. looks like this method should be called after `animation` really ends and `onAnimationEnd` is called by still alive `animation`. you may try to `holder.itemView.clearAnimation()` before dispatching remove finished or delay this call using some `Handler` or `holder.itemView.post(...` like answers under link are suggesting – snachmsm Sep 17 '20 at 18:28
  • @snachmsm Tried with 'post', it solves the issue, but is it safe to use? Looks very hacky. You can post this solution as answer – Yaroslav Shulyak Sep 21 '20 at 05:32
  • Oops, it solves the crash, but items are not animated – Yaroslav Shulyak Sep 21 '20 at 05:58

0 Answers0