{"record":{"id":"6b336bfd4c6f6516","repo":"didi/DoKit","slug":"failed-to-get-size-6b336b","errorCode":null,"errorMessage":"failed to get size","messagePattern":"failed to get size","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/toolpanel/decoration/VerticalDividerItemDecoration.java","lineNumber":209,"sourceCode":"    @Override\n    protected void setItemOffsets(Rect outRect, int position, RecyclerView parent) {\n        if (mPositionInsideItem) {\n            outRect.set(0, 0, 0, 0);\n            return;\n        }\n        outRect.set(0, 0, getDividerSize(position, parent), 0);\n    }\n\n    private int getDividerSize(int position, RecyclerView parent) {\n        if (mPaintProvider != null) {\n            return (int) mPaintProvider.dividerPaint(position, parent).getStrokeWidth();\n        } else if (mSizeProvider != null) {\n            return mSizeProvider.dividerSize(position, parent);\n        } else if (mDrawableProvider != null) {\n            Drawable drawable = mDrawableProvider.drawableProvider(position, parent);\n            return drawable.getIntrinsicWidth();\n        }\n        throw new RuntimeException(\"failed to get size\");\n    }\n\n    /**\n     * Interface for controlling divider margin\n     */\n    public interface MarginProvider {\n\n        /**\n         * Returns top margin of divider.\n         *\n         * @param position Divider position (or group index for GridLayoutManager)\n         * @param parent   RecyclerView\n         * @return top margin\n         */\n        int dividerTopMargin(int position, RecyclerView parent);\n\n        /**\n         * Returns bottom margin of divider.","sourceCodeStart":191,"sourceCodeEnd":227,"githubUrl":"https://github.com/didi/DoKit/blob/626827cddb2feb2f3aee87a52a064b4e5ca2bed4/Android/dokit/src/main/java/com/didichuxing/doraemonkit/kit/toolpanel/decoration/VerticalDividerItemDecoration.java#L191-L227","documentation":"Same fail-fast guard as the horizontal variant, but in VerticalDividerItemDecoration.getDividerSize: it needs a divider WIDTH for outRect.set(0, 0, size, 0) and throws RuntimeException when no mPaintProvider, mSizeProvider, or mDrawableProvider is set. Note the vertical variant has no mSpaceProvider branch, so a space provider alone will NOT satisfy it. Thrown during RecyclerView layout as soon as getItemOffsets runs.","triggerScenarios":"new VerticalDividerItemDecoration.Builder(context).build() with zero provider setters; or setting only a marginProvider (which controls insets, not size); or porting code from the horizontal decoration that relied on spaceProvider.","commonSituations":"Copy-pasting divider setup between list layouts where the vertical one lost its size/drawable provider; assuming marginProvider determines thickness.","solutions":["Set a size provider before build(): .sizeProvider((position, parent) -> dividerWidthPx)","Or use the common one-liner .drawable(drawableRes) / .drawableProvider(...) so getIntrinsicWidth() is used","Do not rely on spaceProvider here — the vertical decoration has no space branch; use size or drawable/paint provider","Remove the decoration entirely if no divider is wanted"],"exampleFix":"// before\nrecyclerView.addItemDecoration(new VerticalDividerItemDecoration.Builder(this).build());\n\n// after\nrecyclerView.addItemDecoration(\n    new VerticalDividerItemDecoration.Builder(this)\n        .sizeProvider((position, parent) -> Math.round(1 * getResources().getDisplayMetrics().density))\n        .build());","handlingStrategy":"validation","validationCode":"// Always configure a size source for the vertical divider.\nVerticalDividerItemDecoration deco = new VerticalDividerItemDecoration.Builder(context)\n    .sizeProvider((position, parent) -> Math.round(1 * context.getResources().getDisplayMetrics().density))\n    .build();\nrecyclerView.addItemDecoration(deco);","typeGuard":null,"tryCatchPattern":"try {\n  recyclerView.addItemDecoration(deco);\n} catch (RuntimeException e) {\n  if (e.getMessage() != null && e.getMessage().contains(\"failed to get size\")) {\n    Log.w(TAG, \"Vertical divider lacks size/drawable provider; skipping\", e);\n  } else throw e;\n}","preventionTips":["Remember the vertical variant has NO spaceProvider branch — size, drawable, or paint provider required","Do not assume marginProvider sets thickness; it only sets insets","Keep divider builders centralized in one utility so the provider is never forgotten"],"tags":["android","recyclerview","ui","configuration"],"backgroundTag":null,"analyzedSha":"626827cddb2feb2f3aee87a52a064b4e5ca2bed4","analyzedAt":"2026-08-14T12:45:58.758Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}