{"record":{"id":"b2294af9e0384ded","repo":"youth5201314/banner","slug":"expected-the-page-view-to-be-managed-by-a-viewpage","errorCode":null,"errorMessage":"Expected the page view to be managed by a ViewPager2 instance.","messagePattern":"Expected the page view to be managed by a ViewPager2 instance\\.","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"banner/src/main/java/com/youth/banner/transformer/MZScaleInTransformer.java","lineNumber":70,"sourceCode":"            view.setScaleX(scale + mMinScale);\n            view.setScaleY(scale + mMinScale);\n        } else {\n            view.setScaleX(mMinScale);\n            view.setScaleY(mMinScale);\n            view.setTranslationX(-reduceX);\n        }\n\n    }\n\n    private ViewPager2 requireViewPager(@NonNull View page) {\n        ViewParent parent = page.getParent();\n        ViewParent parentParent = parent.getParent();\n\n        if (parent instanceof RecyclerView && parentParent instanceof ViewPager2) {\n            return (ViewPager2) parentParent;\n        }\n\n        throw new IllegalStateException(\n                \"Expected the page view to be managed by a ViewPager2 instance.\");\n    }\n}\n","sourceCodeStart":52,"sourceCodeEnd":74,"githubUrl":"https://github.com/youth5201314/banner/blob/777c7dbfaa0a48d78101858d5520f695fef91fbd/banner/src/main/java/com/youth/banner/transformer/MZScaleInTransformer.java#L52-L74","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Ensure the transformer is only registered via viewPager2.setPageTransformer(new MZScaleInTransformer()) on a real ViewPager2.","If you wrapped pages in an extra container, make the RecyclerView a direct child of ViewPager2, or remove the intermediate parent.","Use a different/custom PageTransformer that does not require a ViewPager2 parent for non-pager RecyclerViews.","Verify the parent chain: ((ViewGroup) view.getParent()) instanceof ViewPager2 must hold at transform time."],"exampleFix":"// before\nBanner banner = new Banner(context);\nbanner.setPageTransformer(new MZScaleInTransformer()); // banner's view is not ViewPager2-managed\n// after\nViewPager2 viewPager2 = findViewById(R.id.view_pager);\nviewPager2.setPageTransformer(new MZScaleInTransformer()); // RecyclerView is direct child of ViewPager2","handlingStrategy":"type-guard","validationCode":"ViewParent p = recyclerView.getParent();\nif (!(p instanceof ViewPager2)) {\n    throw new IllegalStateException(\"RecyclerView must be a direct child of a ViewPager2 to use MZScaleInTransformer\");\n}\nviewPager2.setPageTransformer(new MZScaleInTransformer());","typeGuard":"ViewParent p = pageView.getParent();\nboolean isPagerChild = pageView instanceof RecyclerView && p instanceof ViewPager2;\nViewPager2 vp2 = isPagerChild ? (ViewPager2) p : null;","tryCatchPattern":"try {\n    viewPager2.setPageTransformer(new MZScaleInTransformer());\n} catch (IllegalStateException e) {\n    Log.w(\"Banner\", \"MZScaleInTransformer requires ViewPager2, skipping transformer\", e);\n}","preventionTips":["Register page transformers only via ViewPager2.setPageTransformer.","Avoid inserting wrapper layouts between ViewPager2 and its page RecyclerView.","Only use MZ* transformers with ViewPager2-style pagers, not plain RecyclerViews.","Test transformer changes on real pager layouts, not standalone RecyclerViews."],"tags":["android","viewpager2","page-transformer","banner"],"backgroundTag":"invalid-state-transition","analyzedSha":"777c7dbfaa0a48d78101858d5520f695fef91fbd","analyzedAt":"2026-09-08T00:03:24.747Z","contentChangedAt":"2026-09-08T00:03:24.747Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}