{"record":{"id":"0251ccfb2985a96e","repo":"airbnb/epoxy","slug":"layout-resources-are-unsupported-views-must-be-created-with","errorCode":null,"errorMessage":"Layout resources are unsupported. Views must be created with `buildView`","messagePattern":"Layout resources are unsupported\\. Views must be created with `buildView`","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyModelWithView.java","lineNumber":49,"sourceCode":"   * @see androidx.recyclerview.widget.RecyclerView.Adapter#getItemViewType(int)\n   */\n  @Override\n  protected int getViewType() {\n    return 0;\n  }\n\n  /**\n   * Create and return a new instance of a view for this model. If no layout params are set on the\n   * returned view then default layout params will be used.\n   *\n   * @param parent The parent ViewGroup that the returned view will be added to.\n   */\n  @Override\n  public abstract T buildView(@NonNull ViewGroup parent);\n\n  @Override\n  protected final int getDefaultLayout() {\n    throw new UnsupportedOperationException(\n        \"Layout resources are unsupported. Views must be created with `buildView`\");\n  }\n\n  @Override\n  public EpoxyModel<T> layout(@LayoutRes int layoutRes) {\n    throw new UnsupportedOperationException(\n        \"Layout resources are unsupported. Views must be created with `buildView`\");\n  }\n}\n","sourceCodeStart":31,"sourceCodeEnd":59,"githubUrl":"https://github.com/airbnb/epoxy/blob/e45bd3a61fe3a1f130e184f5b8dcf172ab99025a/epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyModelWithView.java#L31-L59","documentation":"EpoxyModelWithView builds its view programmatically via buildView(parent) instead of inflating a layout resource, so getDefaultLayout — which EpoxyModel relies on for normal layout-based models — is deliberately unsupported and always throws UnsupportedOperationException.","triggerScenarios":"Anything that causes EpoxyModelWithView.getDefaultLayout() to be invoked: using view-type/layout-resolution paths that ask the model for a default layout resource.","commonSituations":"Mixing EpoxyModelWithView models with APIs that expect layout-resource-based models; calling internal layout resolution on a programmatic-view model.","solutions":["Implement buildView(ViewGroup) in your EpoxyModelWithView subclass and construct the view in code","Never rely on layout resources for this model type; use buildView for all view creation","If you need XML layouts, extend EpoxyModel (with layout res) instead of EpoxyModelWithView"],"exampleFix":"// before\n@Override\nprotected int getDefaultLayout() { return R.layout.item; } // on EpoxyModelWithView\n// after\n@Override\npublic MyView buildView(@NonNull ViewGroup parent) {\n  return new MyView(parent.getContext());\n}","handlingStrategy":"validation","validationCode":"if (model instanceof EpoxyModelWithView) { assert model.buildView != null; }","typeGuard":"boolean usesProgrammaticView(EpoxyModel<?> m) { return m instanceof EpoxyModelWithView; }","tryCatchPattern":"try { controller.requestModelBuild(); } catch (UnsupportedOperationException e) { Log.e(TAG, \"layout() not supported for view-built models\", e); }","preventionTips":["Never call .layout(...) on EpoxyModelWithView subclasses","Implement buildView for all programmatic-view models","Use EpoxyModel + layout res when XML layouts are needed"],"tags":["android","epoxy","unsupported-operation","view-builder"],"backgroundTag":"unsupported-operation","analyzedSha":"e45bd3a61fe3a1f130e184f5b8dcf172ab99025a","analyzedAt":"2026-09-13T03:24:16.052Z","contentChangedAt":"2026-09-13T03:24:16.052Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}