{"record":{"id":"843061ad3eb9f686","repo":"Tencent/QMUI_Android","slug":"refreshview-must-be-a-instance-of-irefreshview","errorCode":null,"errorMessage":"refreshView must be a instance of IRefreshView","messagePattern":"refreshView must be a instance of IRefreshView","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"qmui/src/main/java/com/qmuiteam/qmui/widget/pullRefreshLayout/QMUIPullRefreshLayout.java","lineNumber":266,"sourceCode":"    public boolean isRefreshing() {\n        return mIsRefreshing;\n    }\n\n    /**\n     * 覆盖该方法以实现自己的 RefreshView。\n     *\n     * @return 自定义的 RefreshView, 注意该 View 必须实现 {@link IRefreshView} 接口\n     */\n    protected View createRefreshView() {\n        return new RefreshView(getContext());\n    }\n\n    private void addRefreshView() {\n        if (mRefreshView == null) {\n            mRefreshView = createRefreshView();\n        }\n        if (!(mRefreshView instanceof IRefreshView)) {\n            throw new RuntimeException(\"refreshView must be a instance of IRefreshView\");\n        }\n        mIRefreshView = (IRefreshView) mRefreshView;\n        if (mRefreshView.getLayoutParams() == null) {\n            mRefreshView.setLayoutParams(new LayoutParams(\n                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));\n        }\n        addView(mRefreshView);\n    }\n\n    /**\n     * 设置在下拉过程中 RefreshView 的偏移量\n     */\n    public void setRefreshOffsetCalculator(RefreshOffsetCalculator refreshOffsetCalculator) {\n        mRefreshOffsetCalculator = refreshOffsetCalculator;\n    }\n\n    @Override\n    protected int getChildDrawingOrder(int childCount, int i) {","sourceCodeStart":248,"sourceCodeEnd":284,"githubUrl":"https://github.com/Tencent/QMUI_Android/blob/026e7d486677d6593a96689cd590ec3561176717/qmui/src/main/java/com/qmuiteam/qmui/widget/pullRefreshLayout/QMUIPullRefreshLayout.java#L248-L284","documentation":"QMUIPullRefreshLayout.addRefreshView throws when the configured mRefreshView is not an instance of IRefreshView. The layout needs the refresh view to implement its refresh interaction contract (onRefreshStart, onRefreshComplete, etc.), so any arbitrary View is rejected.","triggerScenarios":"Calling setRefreshView(someView) with a plain View or a custom view that does not implement com.qmuiteam.qmui.widget.pullRefreshLayout.IRefreshView, then triggering layout/refresh initialization.","commonSituations":"Setting a custom loading spinner View that implements the wrong (or no) refresh interface; migrating from another pull-to-refresh library whose view classes are not adapted; implementing IRefreshView but on a wrapper rather than the set view itself.","solutions":["Make the view passed to setRefreshView implement IRefreshView (and its required methods).","Use the library's built-in refresh views (e.g. QMUITopDialog-style default or any bundled IRefreshView implementation).","If wrapping an existing view, implement IRefreshView on the wrapper class you pass to setRefreshView."],"exampleFix":"// before\nrefreshLayout.setRefreshView(new ProgressBar(context)); // not IRefreshView\n// after\nclass MyRefreshView extends View implements IRefreshView { ... }\nrefreshLayout.setRefreshView(new MyRefreshView(context));","handlingStrategy":"type-guard","validationCode":"View v = candidateRefreshView;\nif (v instanceof IRefreshView) {\n    refreshLayout.setRefreshView(v);\n} else {\n    throw new IllegalArgumentException(\"refresh view must implement IRefreshView\");\n}","typeGuard":"private static boolean isIRefreshView(View v) {\n    return v instanceof IRefreshView;\n}","tryCatchPattern":"try {\n    refreshLayout.setRefreshView(candidate);\n} catch (RuntimeException e) {\n    Log.e(TAG, \"custom refresh view must implement IRefreshView\", e);\n}","preventionTips":["Have custom refresh spinners implement IRefreshView (all required methods).","Prefer the library's built-in IRefreshView implementations.","Implement the interface on the exact view instance passed to setRefreshView, not a wrapper you don't pass."],"tags":["android","qmui","type-mismatch","pull-to-refresh"],"backgroundTag":"incompatible-source-type","analyzedSha":"026e7d486677d6593a96689cd590ec3561176717","analyzedAt":"2026-09-06T13:32:24.816Z","contentChangedAt":"2026-09-06T13:32:24.816Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}