首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

无法为RecyclerView的DividerItemDecoration设置自定义可绘制

在Android开发中,RecyclerView 是一个非常常用的组件,用于显示大量数据列表。DividerItemDecoration 是一个用于在 RecyclerView 的项目之间添加分隔线的类。如果你遇到无法为 RecyclerViewDividerItemDecoration 设置自定义可绘制(Drawable)的问题,可能是由于以下几个原因:

基础概念

  • RecyclerView: 是一个用于显示大量数据列表的视图组件,支持复杂的布局管理。
  • ItemDecoration: 是一个用于在 RecyclerView 的项目之间添加装饰(如分隔线)的基类。
  • DividerItemDecoration: 是 ItemDecoration 的一个具体实现,用于添加分隔线。

相关优势

  • 自定义分隔线可以提升应用的用户界面美观度。
  • 可以根据不同的列表项设置不同的分隔线样式。

类型与应用场景

  • 内置类型: 如 DividerItemDecoration 提供了默认的分隔线样式。
  • 自定义类型: 可以通过继承 ItemDecoration 来创建完全自定义的分隔线。

遇到的问题及原因

如果你无法设置自定义的可绘制对象,可能是因为以下原因:

  1. 资源未找到: 自定义的可绘制资源可能没有正确添加到项目的资源文件夹中。
  2. 代码错误: 设置自定义可绘制对象的代码可能存在语法或逻辑错误。
  3. 版本兼容性: 使用的 RecyclerViewDividerItemDecoration 的版本可能不兼容。

解决方法

以下是一个示例代码,展示如何为 RecyclerView 设置自定义的分隔线:

步骤 1: 创建自定义的 ItemDecoration

代码语言:txt
复制
public class CustomDividerItemDecoration extends RecyclerView.ItemDecoration {
    private Drawable divider;

    public CustomDividerItemDecoration(Context context, int resId) {
        divider = ContextCompat.getDrawable(context, resId);
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();

        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = parent.getChildAt(i);

            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

            int top = child.getBottom() + params.bottomMargin;
            int bottom = top + divider.getIntrinsicHeight();

            divider.setBounds(left, top, right, bottom);
            divider.draw(c);
        }
    }
}

步骤 2: 在 RecyclerView 中应用自定义 ItemDecoration

代码语言:txt
复制
// 假设你的自定义分隔线资源是 R.drawable.custom_divider
CustomDividerItemDecoration dividerItemDecoration = new CustomDividerItemDecoration(this, R.drawable.custom_divider);
recyclerView.addItemDecoration(dividerItemDecoration);

注意事项

  • 确保 R.drawable.custom_divider 是你在 res/drawable 目录下定义的有效可绘制资源。
  • 如果你的 RecyclerView 使用了不同的布局管理器(如 GridLayoutManagerStaggeredGridLayoutManager),可能需要调整分隔线的计算方式。

通过以上步骤,你应该能够成功地为 RecyclerView 设置自定义的分隔线。如果问题仍然存在,请检查资源文件是否正确添加,并确保没有其他代码冲突或错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

教你玩转 Android RecyclerView:深入解析 RecyclerView.ItemDecoration类(含实例讲解)

:onDraw() // 作用:在子视图上设置绘制范围,并绘制内容 // 类似平时自定义View时写onDraw()一样 // 绘制图层在ItemView以下,所以如果绘制区域与...的基础上绘制内容 如分割线等等 2.2.5 实例讲解 实例说明:在ItemView设计一个高度为 10 px 的红色分割线 思路 通过getItemOffsets()设置与 Item 的下间隔区域...= 10 px 设置好onDraw()可绘制的区域 通过onDraw()绘制一个高度 = 10px的矩形(填充颜色=红色) ?...{ private Paint mPaint; // 在构造函数里进行绘制的初始化,如画笔属性设置等 public DividerItemDecoration() {...= 0) { outRect.set(0, 0, 0, 10); // 设置间隔区域为10px,即onDraw()可绘制的区域为10px

2K21

【RecyclerView】 九、为 RecyclerView 设置不同的布局样式

文章目录 一、为 RecyclerView 设置不同的布局样式 二、完整代码 三、RecyclerView 相关资料 一、为 RecyclerView 设置不同的布局样式 ---- 为 RecyclerView...设置不同的布局样式流程 : ① 自定义 RecyclerView.Adapter 泛型类型 : 适配器的泛型类型需要设置为 RecyclerView.ViewHolder , 这是所有 ViewHolder...( ) 方法 : 这里为不同位置的组件设置不同的布局类型 ; @Override public int getItemViewType(int position) {.../** * RecyclerView 适配器 * RecyclerView.Adapter 中的 ViewHolder 泛型设置为 RecyclerView.ViewHolder.../recyclerview 高级 RecyclerView 自定义 : https://developer.android.google.cn/guide/topics/ui/layout/recyclerview-custom

88900
  • 关于RecyclerView你知道的不知道的都在这了(下)目录正文

    移出屏幕的 ViewHolder 会被缓存到两个容器中,按优先级高到低分别是:mCachedViews 和 mRecyclerPool 该方法就是用于设置 mCachedViews 容器的大小,默认值为...多个 RecyclerView 可共用同一个 RecyclerViewPool 容器。 该容器以 Item 的 type 区分缓存,每种 type 的默认存储容量为 5。...ItemDecoration RecyclerView 支持为每个 Item 之间自定义间隔样式,是要空段距离,还是要以分割线隔开,还是要唯美唯幻的边框,想长啥样都行,自己写得出来就可以了,它给我们提供了这个接口...外,内部的View之间横竖都以相同空隙间隔开 //实现方式,以水平方向为例: //每个view的left和bottom都设置相同间隙 //去掉第1列的left...onDraw() 这个方法就是用于绘制,注意这个方法参数只给了 RecyclerView,而绘制 item 的 Decoration 是针对于每个 item 而言的,所以内部需要通过遍历子 View 来对每个

    1.3K30

    Android开发之漫漫长途 XV——RecyclerView

    的布局管理器LayoutManager控制 你想要控制Item间的间隔(可绘制),想自定义更多样式的分割线,之前你可以设置divider,那么现在你可以使用RecyclerView的ItemDecoration...; 这里的DividerItemDecoration是Google给了一个参考的实现类,这里我们通过分析这个例子来看如何自定义Item Decoration。...接着设置mOrientation,我们这里传入的是DividerItemDecoration.VERTICAL。...我们在为RecyclerView添加分割线的时候使用 //设置分割线 mRecyclerView.addItemDecoration( new DividerItemDecoration(this...设置EmptyView 上面已经详细给出了为RecyclerView添加Header以及Footer的例子,关于EmptyView的实现方法与上面基本类似,读者可自行实现,当然在本篇末会给出完整的源码地址

    2.3K20

    Android自定义View实战 :如何优雅实现一个时间轴显示控件?

    前言 Android开发中,时间轴的 UI需求非常常见,如下图: 本文将结合 自定义View & RecyclerView的知识,手把手教你实现该常见 & 实用的自定义View:时间轴 Carson...2.1 效果图 2.2 实现思路 2.3 实现步骤 导入 使用 RecyclerView的包 设置主布局 & RecyclerView的Item布局 设置RecyclerView的 Adapter...开发:ListView、AdapterView、RecyclerView全面解析 步骤 4 涉及到RecyclerView 高级使用 & 自定义View的知识,具体请看Canvas类的最全面详解 - 自定义...上偏移长度分别为200 px & 50px,即此为onDraw()可绘制的区域 outRect.set(itemView_leftinterval, itemView_topinterval...Rv.addItemDecoration(new DividerItemDecoration(this)); //为ListView绑定适配器 myAdapter

    1.6K20

    Android:手把手带你全面学习常见的RecylerView!

    , DividerItemDecoration.HORIZONTAL_LIST)); 问:相比较于ListView,RecyclerView基本需要上面一系列步骤进行设置,而ListView可能只需要去设置一个...答:从名字上看RecyclerView,即回收循环视图,也就是说RecyclerView只管回收与复用View,其他的你可以自己去设置,可以看出其高度的解耦,给予你充分的定制自由 2.2 缺点 RecyclerView...RecyclerView.ItemDecoration { /* * RecyclerView的布局方向,默认先赋值 * 为纵向布局 * RecyclerView...布局可横向,也可纵向 * 横向和纵向对应的分割想画法不一样 * */ private int mOrientation = LinearLayoutManager.VERTICAL...分割线的画笔,和设置其属性 * 来绘制个性分割线 */ private Paint mPaint ; /** * 构造方法传入布局方向,不可不传

    83230

    Android RecyclerView 使用完全解析 体验艺术般的控件

    你想要控制其显示的方式,请通过布局管理器LayoutManager 你想要控制Item间的间隔(可绘制),请通过ItemDecoration 你想要控制Item增删的动画,请通过ItemAnimator...getItemOffsets 可以通过outRect.set()为每个Item设置一定的偏移量,主要用于绘制Decorator。...当然了,改为GridLayoutManager以后,对于分割线,前面的DividerItemDecoration就不适用了,主要是因为它在绘制的时候,比如水平线,针对每个child的取值为: final...最重要还是去理解,如何绘制什么的不重要。一般如果仅仅是希望有空隙,还是去设置item的margin方便。 最后的效果是: ? ok,看到这,你可能还觉得RecyclerView不够强大?...可以看到RecyclerView可以实现: ListView的功能 GridView的功能 横向ListView的功能,参考Android 自定义RecyclerView 实现真正的Gallery效果

    1.6K10

    Carson带你学Android:手把手带你深入学习RecylerView

    答:从名字上看RecyclerView,即回收循环视图,也就是说RecyclerView只管回收与复用View,其他的你可以自己去设置,可以看出其高度的解耦,给予你充分的定制自由 2.2 缺点 RecyclerView...定义一个HashMap构成的列表,将数据以键值对的方式存放在里面。 构造Adapter对象,设置适配器。 将RecyclerView绑定到Adapter上。 6....RecyclerView.ItemDecoration { /* * RecyclerView的布局方向,默认先赋值 * 为纵向布局 * RecyclerView...布局可横向,也可纵向 * 横向和纵向对应的分割想画法不一样 * */ private int mOrientation = LinearLayoutManager.VERTICAL...分割线的画笔,和设置其属性 * 来绘制个性分割线 */ private Paint mPaint ; /** * 构造方法传入布局方向,不可不传

    58320

    【Android 事件分发】ItemTouchHelper 事件分发源码分析 ( 绑定 RecyclerView )

    事件分发源码分析入口 ---- ItemTouchHelper 使用时 , 是为 ItemTouchHelper 设置一个 RecyclerView 列表 , 不是给 RecyclerView 设置一个...mRecyclerView 成员为绑定的 RecyclerView 列表 , 并调用 setupCallbacks 方法 , 为 ItemTouchHelper 设置回调 ; 在 setupCallbacks...RecyclerView 设置条目装饰 , 该装饰可以在条目组件 底部 上层 绘制 Canvas 图形 , 具体的方法如下 : public class RecyclerView extends ViewGroup...parent) { } } 参考 Android 官方提供的 RecyclerView.ItemDecoration 的实现类 DividerItemDecoration ,..., 可以绘制任何图形 , 图片 , 颜色 , 与自定义组件绘制功能一样强大 ; 三、博客资源 博客资源 : GitHub 地址 : https://github.com/han1202012/001_

    40020

    Android开发:ListView、AdapterView、RecyclerView全面解析

    true,选中的列表项将会显示在上面 android:listSelector 为点击到的Item设置图片 如果该属性设置为true,选中的列表项将会显示在上面 android:fastScrollEnabled...android:listSelector 指定被选中的列表项上绘制的Drawable android:scrollingCache 滚动时是否使用缓存 如果设置为true,则在滚动时将会使用缓存 android...类似,用于绑定游标(直接从数据数取出数据)作为列表项的数据源 BaseAdapter:可自定义ListView,通用用于被扩展。...BaseAdapter 定义 可自定义ListView,通用用于被扩展。扩展BaseAdapter可以对各个列表项进行最大程度的定制 使用步骤: 1. 定义主xml布局 2....- 控制Item间的间隔(可绘制)-通过ItemDecoration - 控制Item增删的动画- 通过ItemAnimator mRecyclerView = findView(R.id.id_recyclerview

    3.5K30

    RecyclerView必知必会

    方法是:创建一个类并继承RecyclerView.ItemDecoration,重写以下两个方法: onDraw(): 绘制分割线。 getItemOffsets(): 设置分割线的宽、高。...Google在sample中给了一个参考的实现类:DividerItemDecoration,这里我们通过分析这个例子来看如何自定义Item Decoration。...()设置的外间距: 这里我们只考虑mOrientation == VERTICAL_LIST的情况,DividerItemDecoration的onDraw()实际上调用了drawVertical(...具体实现如下: 然后通过以下代码为RecyclerView设置该滑动、拖拽功能: 前面拖拽的触发方式只有长按,如果想支持触摸Item中的某个View实现拖拽,则核心方法为helper.startDrag...实现中需要注意的点有: 我们为ToolBar的app:layout_collapseMode设置为pin,表示折叠之后固定在顶端,而为ImageView的app:layout_collapseMode设置为

    4.7K20

    RecyclerView 必知必会

    从定义可以看出,flexible(可扩展性)是RecyclerView的特点。不过我们发现和ListView有点像,本文后面会介绍RecyclerView和ListView的区别。...方法是:创建一个类并继承RecyclerView.ItemDecoration,重写以下两个方法: onDraw(): 绘制分割线。 getItemOffsets(): 设置分割线的宽、高。...Google在sample中给了一个参考的实现类:DividerItemDecoration,这里我们通过分析这个例子来看如何自定义Item Decoration。...添加setEmptyView ListView提供了setEmptyView()设置Adapter数据为空时的View视图。RecyclerView虽然没提供直接的API,但是也可以很简单地实现。...实现中需要注意的点有: 我们为ToolBar的app:layout_collapseMode设置为pin,表示折叠之后固定在顶端,而为ImageView的app:layout_collapseMode设置为

    2.6K70

    Android开发笔记(一百二十二)循环器视图RecyclerView

    ,方便开发者根据类型加载不同的布局; 4、可单独对个别项进行增删改操作,无需刷新整个列表; 下面是RecyclerView.Adapter的一个自定义类的代码例子: import com.example.exmrecycler.R...下面是LinearLayoutManager的常用方法: 构造函数 : 可指定列表的方向与是否为相反方向开始布局。 setOrientation : 单独设置列表的方向。...setReverseLayout : 单独设置是否为相反方向开始布局。默认false,如果设置为true,那么垂直方向将从下往上开始布局,水平方向将从右往左开始布局。...下面是GridLayoutManager的常用方法: 构造函数 : 可指定网格的列数。 setSpanCount : 单独设置网格的列数。...setReverseLayout : 设置是否为相反方向开始布局。默认false,如果设置为true,那么垂直方向将从下往上开始布局,水平方向将从右往左开始布局。

    2.4K20
    领券