youth5201314/banner · error · IllegalStateException

Expected the page view to be managed by a ViewPager2…

Error message

Expected the page view to be managed by a ViewPager2 instance.

What it means

MZScaleInTransformer's transformPage() needs the ViewPager2 that owns the page view to apply scaling relative to the pager. It calls requireViewPager (via viewPager()), which throws IllegalStateException if the view being transformed is not a RecyclerView whose direct parent is a ViewPager2. This enforces that the transformer is only used as a ViewPager2 page transformer.

Solutions

  1. Ensure the transformer is only registered via viewPager2.setPageTransformer(new MZScaleInTransformer()) on a real ViewPager2.
  2. If you wrapped pages in an extra container, make the RecyclerView a direct child of ViewPager2, or remove the intermediate parent.
  3. Use a different/custom PageTransformer that does not require a ViewPager2 parent for non-pager RecyclerViews.
  4. Verify the parent chain: ((ViewGroup) view.getParent()) instanceof ViewPager2 must hold at transform time.

Example fix

// before
Banner banner = new Banner(context);
banner.setPageTransformer(new MZScaleInTransformer()); // banner's view is not ViewPager2-managed
// after
ViewPager2 viewPager2 = findViewById(R.id.view_pager);
viewPager2.setPageTransformer(new MZScaleInTransformer()); // RecyclerView is direct child of ViewPager2
Defensive patterns

Strategy: type-guard

Validate before calling

ViewParent p = recyclerView.getParent();
if (!(p instanceof ViewPager2)) {
    throw new IllegalStateException("RecyclerView must be a direct child of a ViewPager2 to use MZScaleInTransformer");
}
viewPager2.setPageTransformer(new MZScaleInTransformer());

Type guard

ViewParent p = pageView.getParent();
boolean isPagerChild = pageView instanceof RecyclerView && p instanceof ViewPager2;
ViewPager2 vp2 = isPagerChild ? (ViewPager2) p : null;

Try / catch

try {
    viewPager2.setPageTransformer(new MZScaleInTransformer());
} catch (IllegalStateException e) {
    Log.w("Banner", "MZScaleInTransformer requires ViewPager2, skipping transformer", e);
}

Prevention

When it happens

Trigger: Calling mzpTransformer on a plain RecyclerView not inside a ViewPager2; attaching the transformer via setOffscreenPageLimit/transformer to a non-ViewPager2 view; a custom parent container placed between the RecyclerView and ViewPager2 so getParent() is no longer ViewPager2; reusing the transformer on arbitrary views.

Common situations: Applying a ViewPager2 page transformer to a standalone RecyclerView; nesting pages inside additional FrameLayout/ConstraintLayout wrappers so the RecyclerView's parent is the wrapper, not the ViewPager2; copy-pasting the transformer onto a banner whose internal structure differs.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


AI-assisted analysis of youth5201314/banner@777c7dbfaa (2026-09-08). Data as JSON: /api/errors/b2294af9e0384ded. Report an issue: GitHub.

Appendix: source

Thrown at banner/src/main/java/com/youth/banner/transformer/MZScaleInTransformer.java:70

            view.setScaleX(scale + mMinScale);
            view.setScaleY(scale + mMinScale);
        } else {
            view.setScaleX(mMinScale);
            view.setScaleY(mMinScale);
            view.setTranslationX(-reduceX);
        }

    }

    private ViewPager2 requireViewPager(@NonNull View page) {
        ViewParent parent = page.getParent();
        ViewParent parentParent = parent.getParent();

        if (parent instanceof RecyclerView && parentParent instanceof ViewPager2) {
            return (ViewPager2) parentParent;
        }

        throw new IllegalStateException(
                "Expected the page view to be managed by a ViewPager2 instance.");
    }
}

View on GitHub (pinned to 777c7dbfaa)