Fixed
Status Update
Comments
jg...@google.com <jg...@google.com> #2
Hi, thanks for reporting. Should be an easy fix!
I'm guessing it should work find until ~ 2^23 items = ~ 8M items. How did you come across this bug? Do you have a ViewPager2 with that many items?
I'm guessing it should work find until ~ 2^23 items = ~ 8M items. How did you come across this bug? Do you have a ViewPager2 with that many items?
h6...@gmail.com <h6...@gmail.com> #3
Hi, good to hear that.
We have an implementation of RecyclerView.Adapter that supports "infinite looping". So when the infinite looping is enabled, the adapter's getItemCount() reports Int.MAX_VALUE items. We also call setCurrentItem to somewhere in the middle of item count on the ViewPager2, so that's how we got that far.
We have an implementation of RecyclerView.Adapter that supports "infinite looping". So when the infinite looping is enabled, the adapter's getItemCount() reports Int.MAX_VALUE items. We also call setCurrentItem to somewhere in the middle of item count on the ViewPager2, so that's how we got that far.
h6...@gmail.com <h6...@gmail.com> #4
For future reference: first item for which it fails is probably when mCurrentItem = (1 << 25) + 2
h6...@gmail.com <h6...@gmail.com> #5
Project: platform/frameworks/support
Branch: androidx-master-dev
commit 2e9f35536432bed0677171c8ae59b4f67850915a
Author: Jelle Fresen <jellefresen@google.com>
Date: Fri Jul 12 14:26:10 2019
Use double instead of float for decimal positions
A position ranges from 0 to Integer.MAX_VALUE, but floats only have a 23
bit mantissa. Values over 2^23 are rounded to a nearby value.
Solve this by using double instead of float when we need to represent a
position with a fractional component. A double has a mantissa of 52 bit
and can therefore represent all 2^32 possible int values.
Bug: 134858960
Test: ./gradlew viewpager2:cC
Change-Id: I08b97df6fac600caa83366ccab8671541e2c1e7f
A viewpager2/src/androidTest/java/androidx/viewpager2/test/ui/SparseAdapter.kt
M viewpager2/src/androidTest/java/androidx/viewpager2/widget/FakeDragTest.kt
M viewpager2/src/androidTest/java/androidx/viewpager2/widget/OffscreenPageLimitTest.kt
M viewpager2/src/androidTest/java/androidx/viewpager2/widget/PageChangeCallbackTest.kt
M viewpager2/src/androidTest/java/androidx/viewpager2/widget/PageTransformerTest.kt
M viewpager2/src/androidTest/java/androidx/viewpager2/widget/SetItemWhileScrollInProgressTest.kt
M viewpager2/src/main/java/androidx/viewpager2/widget/ScrollEventAdapter.java
M viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
https://android-review.googlesource.com/1014538
https://goto.google.com/android-sha1/2e9f35536432bed0677171c8ae59b4f67850915a
Branch: androidx-master-dev
commit 2e9f35536432bed0677171c8ae59b4f67850915a
Author: Jelle Fresen <jellefresen@google.com>
Date: Fri Jul 12 14:26:10 2019
Use double instead of float for decimal positions
A position ranges from 0 to Integer.MAX_VALUE, but floats only have a 23
bit mantissa. Values over 2^23 are rounded to a nearby value.
Solve this by using double instead of float when we need to represent a
position with a fractional component. A double has a mantissa of 52 bit
and can therefore represent all 2^32 possible int values.
Bug: 134858960
Test: ./gradlew viewpager2:cC
Change-Id: I08b97df6fac600caa83366ccab8671541e2c1e7f
A viewpager2/src/androidTest/java/androidx/viewpager2/test/ui/SparseAdapter.kt
M viewpager2/src/androidTest/java/androidx/viewpager2/widget/FakeDragTest.kt
M viewpager2/src/androidTest/java/androidx/viewpager2/widget/OffscreenPageLimitTest.kt
M viewpager2/src/androidTest/java/androidx/viewpager2/widget/PageChangeCallbackTest.kt
M viewpager2/src/androidTest/java/androidx/viewpager2/widget/PageTransformerTest.kt
M viewpager2/src/androidTest/java/androidx/viewpager2/widget/SetItemWhileScrollInProgressTest.kt
M viewpager2/src/main/java/androidx/viewpager2/widget/ScrollEventAdapter.java
M viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
jg...@google.com <jg...@google.com> #7
I can confirm I can repro this and will try to provide a workaround / fix soon.
Big thanks for the sample app, repro steps and research info. Super appreciated!
Big thanks for the sample app, repro steps and research info. Super appreciated!
jg...@google.com <jg...@google.com> #8
The easiest workaround would involve copying FragmentStateAdapter and FragmentViewHolder into your project, and in FragmentStateAdapter adding ensureFragment(holder.getAdapterPosition()) as the first line of placeFragmentInViewHolder method. Attached as a patch to your sample app.
We'll work on a proper fix. Might unblock you in the meantime though. Thanks again for reporting and a sample app.
We'll work on a proper fix. Might unblock you in the meantime though. Thanks again for reporting and a sample app.
jg...@google.com <jg...@google.com>
ap...@google.com <ap...@google.com> #9
Project: platform/frameworks/support
Branch: androidx-master-dev
commit 07cadad5116ff71ab161a8ef3433679d89530405
Author: Jakub Gielzak <jgielzak@google.com>
Date: Mon Jul 29 15:17:08 2019
Fix for FragmentStateAdapter transient state issue
Fixes a crash when a ViewHolder which has gone through
onFailedToRecycleView is shown again violating Adapter's design
assumptions.
Bug: 134246546
Test: TransientStateFragmentTest
Test: ./gradlew viewpager2:connectedCheck
Change-Id: Ieb166c6fb48907cbb7aa46ab87a3ae4cc29591a6
A viewpager2/src/androidTest/java/androidx/viewpager2/widget/TransientStateFragmentTest.kt
M viewpager2/src/main/java/androidx/viewpager2/adapter/FragmentStateAdapter.java
https://android-review.googlesource.com/1092796
https://goto.google.com/android-sha1/07cadad5116ff71ab161a8ef3433679d89530405
Branch: androidx-master-dev
commit 07cadad5116ff71ab161a8ef3433679d89530405
Author: Jakub Gielzak <jgielzak@google.com>
Date: Mon Jul 29 15:17:08 2019
Fix for FragmentStateAdapter transient state issue
Fixes a crash when a ViewHolder which has gone through
onFailedToRecycleView is shown again violating Adapter's design
assumptions.
Bug: 134246546
Test: TransientStateFragmentTest
Test: ./gradlew viewpager2:connectedCheck
Change-Id: Ieb166c6fb48907cbb7aa46ab87a3ae4cc29591a6
A viewpager2/src/androidTest/java/androidx/viewpager2/widget/TransientStateFragmentTest.kt
M viewpager2/src/main/java/androidx/viewpager2/adapter/FragmentStateAdapter.java
ap...@google.com <ap...@google.com> #10
Project: platform/frameworks/support
Branch: androidx-master-dev
commit a35a5180df0b98c4af4a4e119388f7d70d27ade4
Author: Jakub Gielzak <jgielzak@google.com>
Date: Tue Jul 30 17:27:14 2019
FragmentStateAdapter transient state fix follow-up
Follow-up to Ieb166c6fb48907cbb7aa46ab87a3ae4cc29591a6:
* Disabled tests on API < 16
* Updated a comment
Bug: 134246546
Test: TransientStateFragmentTest
Test: ./gradlew viewpager2:connectedCheck
Change-Id: Id27c1267d4fc75c41849291322952fc1ea0e8d0d
M viewpager2/src/androidTest/java/androidx/viewpager2/widget/TransientStateFragmentTest.kt
M viewpager2/src/main/java/androidx/viewpager2/adapter/FragmentStateAdapter.java
https://android-review.googlesource.com/1093437
https://goto.google.com/android-sha1/a35a5180df0b98c4af4a4e119388f7d70d27ade4
Branch: androidx-master-dev
commit a35a5180df0b98c4af4a4e119388f7d70d27ade4
Author: Jakub Gielzak <jgielzak@google.com>
Date: Tue Jul 30 17:27:14 2019
FragmentStateAdapter transient state fix follow-up
Follow-up to Ieb166c6fb48907cbb7aa46ab87a3ae4cc29591a6:
* Disabled tests on API < 16
* Updated a comment
Bug: 134246546
Test: TransientStateFragmentTest
Test: ./gradlew viewpager2:connectedCheck
Change-Id: Id27c1267d4fc75c41849291322952fc1ea0e8d0d
M viewpager2/src/androidTest/java/androidx/viewpager2/widget/TransientStateFragmentTest.kt
M viewpager2/src/main/java/androidx/viewpager2/adapter/FragmentStateAdapter.java
jg...@google.com <jg...@google.com> #11
The fix is now in place and should come out in the next release.
wa...@gmail.com <wa...@gmail.com> #13
I can't reproduce this myself but I get this issue in production on Xiaomi running Android 10 with ViewPager2 1.0.0 stable release. Any idea what could cause it now?
jg...@google.com <jg...@google.com> #14
Hi, could you share the stack trace?
wa...@gmail.com <wa...@gmail.com> #15
[Deleted User] <[Deleted User]> #16
I am facing this issue in 1.0.0 release
Fatal Exception: java.lang.IllegalStateException
Design assumption violated.
androidx.viewpager2.adapter.FragmentStateAdapter.placeFragmentInViewHolder + 287 (FragmentStateAdapter.java:287)
androidx.viewpager2.adapter.FragmentStateAdapter$1.onLayoutChange + 190 (FragmentStateAdapter.java:190)
android.view.View.layout + 21131 (View.java:21131)
android.view.ViewGroup.layout + 6400 (ViewGroup.java:6400)
androidx.recyclerview.widget.RecyclerView$LayoutManager.layoutDecoratedWithMargins + 9587 (RecyclerView.java:9587)
androidx.recyclerview.widget.LinearLayoutManager.layoutChunk + 1685 (LinearLayoutManager.java:1685)
androidx.recyclerview.widget.LinearLayoutManager.fill + 1587 (LinearLayoutManager.java:1587)
androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren + 665 (LinearLayoutManager.java:665)
androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2 + 4134 (RecyclerView.java:4134)
androidx.recyclerview.widget.RecyclerView.dispatchLayout + 3851 (RecyclerView.java:3851)
androidx.recyclerview.widget.RecyclerView.onLayout + 4404 (RecyclerView.java:4404)
android.view.View.layout + 21112 (View.java:21112)
android.view.ViewGroup.layout + 6400 (ViewGroup.java:6400)
androidx.viewpager2.widget.ViewPager2.onLayout + 527 (ViewPager2.java:527)
android.view.View.layout + 21112 (View.java:21112)
android.view.ViewGroup.layout + 6400 (ViewGroup.java:6400)
androidx.constraintlayout.widget.ConstraintLayout.onLayout + 1915 (ConstraintLayout.java:1915)
android.view.View.layout + 21112 (View.java:21112)
android.view.ViewGroup.layout + 6400 (ViewGroup.java:6400)
android.widget.FrameLayout.layoutChildren + 323 (FrameLayout.java:323)
android.widget.FrameLayout.onLayout + 261 (FrameLayout.java:261)
android.view.View.layout + 21112 (View.java:21112)
android.view.ViewGroup.layout + 6400 (ViewGroup.java:6400)
android.widget.LinearLayout.setChildFrame + 1828 (LinearLayout.java:1828)
android.widget.LinearLayout.layoutVertical + 1656 (LinearLayout.java:1656)
android.widget.LinearLayout.onLayout + 1565 (LinearLayout.java:1565)
android.view.View.layout + 21112 (View.java:21112)
android.view.ViewGroup.layout + 6400 (ViewGroup.java:6400)
android.widget.FrameLayout.layoutChildren + 323 (FrameLayout.java:323)
android.widget.FrameLayout.onLayout + 261 (FrameLayout.java:261)
android.view.View.layout + 21112 (View.java:21112)
android.view.ViewGroup.layout + 6400 (ViewGroup.java:6400)
android.widget.LinearLayout.setChildFrame + 1828 (LinearLayout.java:1828)
android.widget.LinearLayout.layoutVertical + 1656 (LinearLayout.java:1656)
android.widget.LinearLayout.onLayout + 1565 (LinearLayout.java:1565)
android.view.View.layout + 21112 (View.java:21112)
android.view.ViewGroup.layout + 6400 (ViewGroup.java:6400)
android.widget.FrameLayout.layoutChildren + 323 (FrameLayout.java:323)
android.widget.FrameLayout.onLayout + 261 (FrameLayout.java:261)
com.android.internal.policy.DecorView.onLayout + 883 (DecorView.java:883)
android.view.View.layout + 21112 (View.java:21112)
android.view.ViewGroup.layout + 6400 (ViewGroup.java:6400)
android.view.ViewRootImpl.performLayout + 3368 (ViewRootImpl.java:3368)
android.view.ViewRootImpl.performTraversals + 2809 (ViewRootImpl.java:2809)
android.view.ViewRootImpl.doTraversal + 1815 (ViewRootImpl.java:1815)
android.view.ViewRootImpl$TraversalRunnable.run + 8228 (ViewRootImpl.java:8228)
android.view.Choreographer$CallbackRecord.run + 995 (Choreographer.java:995)
android.view.Choreographer.doCallbacks + 807 (Choreographer.java:807)
android.view.Choreographer.doFrame + 739 (Choreographer.java:739)
android.view.Choreographer$FrameDisplayEventReceiver.run + 981 (Choreographer.java:981)
android.os.Handler.handleCallback + 873 (Handler.java:873)
android.os.Handler.dispatchMessage + 99 (Handler.java:99)
android.os.Looper.loop + 226 (Looper.java:226)
android.app.ActivityThread.main + 7212 (ActivityThread.java:7212)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run + 576 (RuntimeInit.java:576)
com.android.internal.os.ZygoteInit.main + 956 (ZygoteInit.java:956)
Fatal Exception: java.lang.IllegalStateException
Design assumption violated.
androidx.viewpager2.adapter.FragmentStateAdapter.placeFragmentInViewHolder + 287 (FragmentStateAdapter.java:287)
androidx.viewpager2.adapter.FragmentStateAdapter$1.onLayoutChange + 190 (FragmentStateAdapter.java:190)
android.view.View.layout + 21131 (View.java:21131)
android.view.ViewGroup.layout + 6400 (ViewGroup.java:6400)
androidx.recyclerview.widget.RecyclerView$LayoutManager.layoutDecoratedWithMargins + 9587 (RecyclerView.java:9587)
androidx.recyclerview.widget.LinearLayoutManager.layoutChunk + 1685 (LinearLayoutManager.java:1685)
androidx.recyclerview.widget.LinearLayoutManager.fill + 1587 (LinearLayoutManager.java:1587)
androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren + 665 (LinearLayoutManager.java:665)
androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2 + 4134 (RecyclerView.java:4134)
androidx.recyclerview.widget.RecyclerView.dispatchLayout + 3851 (RecyclerView.java:3851)
androidx.recyclerview.widget.RecyclerView.onLayout + 4404 (RecyclerView.java:4404)
android.view.View.layout + 21112 (View.java:21112)
android.view.ViewGroup.layout + 6400 (ViewGroup.java:6400)
androidx.viewpager2.widget.ViewPager2.onLayout + 527 (ViewPager2.java:527)
android.view.View.layout + 21112 (View.java:21112)
android.view.ViewGroup.layout + 6400 (ViewGroup.java:6400)
androidx.constraintlayout.widget.ConstraintLayout.onLayout + 1915 (ConstraintLayout.java:1915)
android.view.View.layout + 21112 (View.java:21112)
android.view.ViewGroup.layout + 6400 (ViewGroup.java:6400)
android.widget.FrameLayout.layoutChildren + 323 (FrameLayout.java:323)
android.widget.FrameLayout.onLayout + 261 (FrameLayout.java:261)
android.view.View.layout + 21112 (View.java:21112)
android.view.ViewGroup.layout + 6400 (ViewGroup.java:6400)
android.widget.LinearLayout.setChildFrame + 1828 (LinearLayout.java:1828)
android.widget.LinearLayout.layoutVertical + 1656 (LinearLayout.java:1656)
android.widget.LinearLayout.onLayout + 1565 (LinearLayout.java:1565)
android.view.View.layout + 21112 (View.java:21112)
android.view.ViewGroup.layout + 6400 (ViewGroup.java:6400)
android.widget.FrameLayout.layoutChildren + 323 (FrameLayout.java:323)
android.widget.FrameLayout.onLayout + 261 (FrameLayout.java:261)
android.view.View.layout + 21112 (View.java:21112)
android.view.ViewGroup.layout + 6400 (ViewGroup.java:6400)
android.widget.LinearLayout.setChildFrame + 1828 (LinearLayout.java:1828)
android.widget.LinearLayout.layoutVertical + 1656 (LinearLayout.java:1656)
android.widget.LinearLayout.onLayout + 1565 (LinearLayout.java:1565)
android.view.View.layout + 21112 (View.java:21112)
android.view.ViewGroup.layout + 6400 (ViewGroup.java:6400)
android.widget.FrameLayout.layoutChildren + 323 (FrameLayout.java:323)
android.widget.FrameLayout.onLayout + 261 (FrameLayout.java:261)
com.android.internal.policy.DecorView.onLayout + 883 (DecorView.java:883)
android.view.View.layout + 21112 (View.java:21112)
android.view.ViewGroup.layout + 6400 (ViewGroup.java:6400)
android.view.ViewRootImpl.performLayout + 3368 (ViewRootImpl.java:3368)
android.view.ViewRootImpl.performTraversals + 2809 (ViewRootImpl.java:2809)
android.view.ViewRootImpl.doTraversal + 1815 (ViewRootImpl.java:1815)
android.view.ViewRootImpl$TraversalRunnable.run + 8228 (ViewRootImpl.java:8228)
android.view.Choreographer$CallbackRecord.run + 995 (Choreographer.java:995)
android.view.Choreographer.doCallbacks + 807 (Choreographer.java:807)
android.view.Choreographer.doFrame + 739 (Choreographer.java:739)
android.view.Choreographer$FrameDisplayEventReceiver.run + 981 (Choreographer.java:981)
android.os.Handler.handleCallback + 873 (Handler.java:873)
android.os.Handler.dispatchMessage + 99 (Handler.java:99)
android.os.Looper.loop + 226 (Looper.java:226)
android.app.ActivityThread.main + 7212 (ActivityThread.java:7212)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run + 576 (RuntimeInit.java:576)
com.android.internal.os.ZygoteInit.main + 956 (ZygoteInit.java:956)
jg...@google.com <jg...@google.com> #17
Re
ye...@tokopedia.com <ye...@tokopedia.com> #18
I also facing this issue in 1.0.0 release
ye...@tokopedia.com <ye...@tokopedia.com> #19
ch...@caravan.gg <ch...@caravan.gg> #20
Occurred in 1.0.0
java.lang.IllegalStateException: Design assumption violated.
at androidx.viewpager2.adapter.FragmentStateAdapter.placeFragmentInViewHolder(FragmentStateAdapter.java:287)
at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:276)
at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:67)
at androidx.recyclerview.widget.RecyclerView.dispatchChildAttached(RecyclerView.java:7556)
at androidx.recyclerview.widget.RecyclerView$5.addView(RecyclerView.java:860)
at androidx.recyclerview.widget.ChildHelper.addView(ChildHelper.java:107)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:8601)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8559)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8547)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1641)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at androidx.viewpager2.widget.ViewPager2.onLayout(ViewPager2.java:527)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at com.google.android.material.appbar.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:148)
at com.google.android.material.appbar.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:43)
at com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1892)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:918)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1915)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at androidx.drawerlayout.widget.DrawerLayout.onLayout(DrawerLayout.java:1231)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:
java.lang.IllegalStateException: Design assumption violated.
at androidx.viewpager2.adapter.FragmentStateAdapter.placeFragmentInViewHolder(FragmentStateAdapter.java:287)
at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:276)
at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:67)
at androidx.recyclerview.widget.RecyclerView.dispatchChildAttached(RecyclerView.java:7556)
at androidx.recyclerview.widget.RecyclerView$5.addView(RecyclerView.java:860)
at androidx.recyclerview.widget.ChildHelper.addView(ChildHelper.java:107)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:8601)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8559)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8547)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1641)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at androidx.viewpager2.widget.ViewPager2.onLayout(ViewPager2.java:527)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at com.google.android.material.appbar.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:148)
at com.google.android.material.appbar.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:43)
at com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1892)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:918)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1915)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at androidx.drawerlayout.widget.DrawerLayout.onLayout(DrawerLayout.java:1231)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:
b4...@gmail.com <b4...@gmail.com> #21
version 1.0.0-beta03
java.lang.IllegalStateException: Design assumption violated.
at androidx.viewpager2.adapter.FragmentStateAdapter.placeFragmentInViewHolder(FragmentStateAdapter.java:287)
at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:276)
at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:67)
at androidx.recyclerview.widget.RecyclerView.dispatchChildAttached(RecyclerView.java:7867)
at androidx.recyclerview.widget.RecyclerView$5.addView(RecyclerView.java:893)
at androidx.recyclerview.widget.ChildHelper.addView(ChildHelper.java:107)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:8902)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8860)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8848)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1645)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1591)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:668)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:4255)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:4010)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4578)
at android.view.View.layout(View.java:23219)
at android.view.ViewGroup.layout(ViewGroup.java:6532)
at androidx.viewpager2.widget.ViewPager2.onLayout(ViewPager2.java:527)
at android.view.View.layout(View.java:23219)
at android.view.ViewGroup.layout(ViewGroup.java:6532)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:23219)
at android.view.ViewGroup.layout(ViewGroup.java:6532)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
at android.view.View.layout(View.java:23219)
at android.view.ViewGroup.layout(ViewGroup.java:6532)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:23219)
at android.view.ViewGroup.layout(ViewGroup.java:6532)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
at android.view.View.layout(View.java:23219)
at android.view.ViewGroup.layout(ViewGroup.java:6532)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:23219)
at android.view.ViewGroup.layout(ViewGroup.java:6532)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
at android.view.View.layout(View.java:23219)
at android.view.ViewGroup.layout(ViewGroup.java:6532)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:804)
at android.view.View.layout(View.java:23219)
at android.view.ViewGroup.layout(ViewGroup.java:6532)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3686)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3144)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2115)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8582)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:975)
at android.view.Choreographer.doCallbacks(Choreographer.java:799)
at android.view.Choreographer.doFrame(Choreographer.java:734)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:960)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:236)
at android.app.ActivityThread.main(ActivityThread.java:7864)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:620)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1011)
java.lang.IllegalStateException: Design assumption violated.
at androidx.viewpager2.adapter.FragmentStateAdapter.placeFragmentInViewHolder(FragmentStateAdapter.java:287)
at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:276)
at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:67)
at androidx.recyclerview.widget.RecyclerView.dispatchChildAttached(RecyclerView.java:7867)
at androidx.recyclerview.widget.RecyclerView$5.addView(RecyclerView.java:893)
at androidx.recyclerview.widget.ChildHelper.addView(ChildHelper.java:107)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:8902)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8860)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8848)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1645)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1591)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:668)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:4255)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:4010)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4578)
at android.view.View.layout(View.java:23219)
at android.view.ViewGroup.layout(ViewGroup.java:6532)
at androidx.viewpager2.widget.ViewPager2.onLayout(ViewPager2.java:527)
at android.view.View.layout(View.java:23219)
at android.view.ViewGroup.layout(ViewGroup.java:6532)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:23219)
at android.view.ViewGroup.layout(ViewGroup.java:6532)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
at android.view.View.layout(View.java:23219)
at android.view.ViewGroup.layout(ViewGroup.java:6532)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:23219)
at android.view.ViewGroup.layout(ViewGroup.java:6532)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
at android.view.View.layout(View.java:23219)
at android.view.ViewGroup.layout(ViewGroup.java:6532)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:23219)
at android.view.ViewGroup.layout(ViewGroup.java:6532)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
at android.view.View.layout(View.java:23219)
at android.view.ViewGroup.layout(ViewGroup.java:6532)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:804)
at android.view.View.layout(View.java:23219)
at android.view.ViewGroup.layout(ViewGroup.java:6532)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3686)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3144)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2115)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8582)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:975)
at android.view.Choreographer.doCallbacks(Choreographer.java:799)
at android.view.Choreographer.doFrame(Choreographer.java:734)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:960)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:236)
at android.app.ActivityThread.main(ActivityThread.java:7864)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:620)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1011)
ly...@gmail.com <ly...@gmail.com> #22
The cause is getItemId return the duplicate id.
I find self test stable reproduction.
I find self test stable reproduction.
Description
- androidx.viewpager2:viewpager2:1.0.0-alpha04
I noticed that ViewPager2 sometimes crashes with the following stack trace. Currently, I have not figured out how to reproduce the error frequently, so I will attach the procedure/sample project for reproduction later.
```
java.lang.IllegalStateException: Design assumption violated.
at androidx.viewpager2.adapter.FixedFragmentStateAdapter.placeFragmentInViewHolder(FixedFragmentStateAdapter.java:234)
at androidx.viewpager2.adapter.FixedFragmentStateAdapter.onViewAttachedToWindow(FixedFragmentStateAdapter.java:223)
at androidx.viewpager2.adapter.FixedFragmentStateAdapter.onViewAttachedToWindow(FixedFragmentStateAdapter.java:61)
at androidx.recyclerview.widget.RecyclerView.dispatchChildAttached(RecyclerView.java:7433)
at androidx.recyclerview.widget.RecyclerView$5.addView(RecyclerView.java:862)
at androidx.recyclerview.widget.ChildHelper.addView(ChildHelper.java:107)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:8478)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8436)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1643)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
at androidx.recyclerview.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1391)
at androidx.recyclerview.widget.LinearLayoutManager.scrollHorizontallyBy(LinearLayoutManager.java:1116)
at androidx.recyclerview.widget.RecyclerView.scrollStep(RecyclerView.java:1840)
at androidx.recyclerview.widget.RecyclerView.scrollByInternal(RecyclerView.java:1942)
at androidx.recyclerview.widget.RecyclerView.onTouchEvent(RecyclerView.java:3297)
at androidx.viewpager2.widget.ViewPager2$RecyclerViewImpl.onTouchEvent(ViewPager2.java:797)
at android.view.View.dispatchTouchEvent(View.java:12513)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3024)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2705)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:440)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1830)
at android.app.Activity.dispatchTouchEvent(Activity.java:3400)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:398)
at android.view.View.dispatchPointerEvent(View.java:12752)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5106)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4909)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4585)
```