How to fix ‘Design assumption violated’ error in ViewPager2?

Issue

I’m using ViewPager2, Kotlin and AndroidX. When the adapter is not at index 0 and I change the adapter list and set current item to index 0 the exception is thrown.

java.lang.IllegalStateException: Design assumption violated.
        at androidx.viewpager2.widget.ViewPager2.updateCurrentItem(ViewPager2.java:538)
        at androidx.viewpager2.widget.ViewPager2$4.onAnimationsFinished(ViewPager2.java:518)
        at androidx.recyclerview.widget.RecyclerView$ItemAnimator.isRunning(RecyclerView.java:13244)
        at androidx.viewpager2.widget.ViewPager2.onLayout(ViewPager2.java:515)
        at android.view.View.layout(View.java:15596)

In line 537 of ViewPager2 there is an if which causes the exception:

        // Extra checks verifying assumptions
        // TODO: remove after testing
        View snapView1  mPagerSnapHelper.findSnapView(mLayoutManager);
        View snapView2  mLayoutManager.findViewByPosition(snapPosition);
        if (snapView1 ! snapView2) {
            throw new IllegalStateException("Design assumption violated.");
        }

This is how I’m updating the adapter list:

adapter.list  newList
adapter.notifyDataSetChanged()
viewpager.setCurrentItem(0, true)

It happens only when smoothScroll is set to true

What am I missing?

Edit : I’m using androidx.viewpager2.widget.ViewPager2 available in com.google.android.material:material:1.1.0-alpha08

Solution

I had this same problem with ViewPager2 on configuration change. I’m using:

implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.viewpager2:viewpager2:1.0.0-beta03'

In my case, I had overridden the getItemId() method in my FragmentStateAdapter class. When I got rid of my getItemId() method, the “IllegalStateException: Design assumption violated” error was no more! 🙂

Answered By – ban-geoengineering

Leave a Comment