该万能分割线参考自博客:RecyclerView的万能分割线_pengkv的博客-CSDN博客_android recyclerview 分割线 在他的基础上添加了距离左右边距的属性。

recyclerview最后一个条目不显示分割线且自定义分割线 - 代码先锋网

该divider可以自己定义宽高、距离左边、右边的距离,颜色等,先来看下效果:

在项目中将RecyclerViewDivider.java考入,然后再引用即可,里面有几个构造函数,可以选择合适自己的,下面举例是参数最多的那个,可以设置颜色,宽高,举例左右边界的距离:

        mRecyclerView.addItemDecoration(new RecycleViewDivider(getApplicationContext(), LinearLayoutManager.VERTICAL, 20, 60, 60, getApplicationContext().getResources().getColor(R.color.colorAccent)));

下面是这个divider的所有代码,注释已经很详细了:

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;public class RecycleViewDivider extends RecyclerView.ItemDecoration {private Paint mPaint;private Drawable mDivider;private int mDividerHeight = 2;//分割线高度,默认为1pxprivate int mOrientation;//列表的方向:LinearLayoutManager.VERTICAL或LinearLayoutManager.HORIZONTALprivate static final int[] ATTRS = new int[]{android.R.attr.listDivider};private int mOffsetLeft = 0;    //分割线偏离左边界private int mOffsetRight = 0;   //分割线偏离右边界/*** 默认分割线:高度为2px,颜色为灰色** @param context* @param orientation 列表方向*/public RecycleViewDivider(Context context, int orientation) {if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) {throw new IllegalArgumentException("请输入正确的参数!");}mOrientation = orientation;final TypedArray a = context.obtainStyledAttributes(ATTRS);mDivider = a.getDrawable(0);a.recycle();}/*** 自定义分割线** @param context* @param orientation 列表方向* @param drawableId  分割线图片*/public RecycleViewDivider(Context context, int orientation, int drawableId) {this(context, orientation);mDivider = ContextCompat.getDrawable(context, drawableId);mDividerHeight = mDivider.getIntrinsicHeight();}/*** 自定义分割线** @param context* @param orientation   列表方向* @param dividerHeight 分割线高度*@param offsetLeft    分割线距离左边距* @param offsetRight   分割线距离右边距* @param dividerColor  分割线颜色*/public RecycleViewDivider(Context context, int orientation, int dividerHeight, int offsetLeft, int offsetRight, int dividerColor) {this(context, orientation);mDividerHeight = dividerHeight;mOffsetLeft = offsetLeft;mOffsetRight = offsetRight;mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint.setColor(dividerColor);mPaint.setStyle(Paint.Style.FILL);}//获取分割线尺寸@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {super.getItemOffsets(outRect, view, parent, state);if (mOrientation == LinearLayoutManager.VERTICAL) {outRect.set(0, 0, 0, mDividerHeight);} else {outRect.set(0, 0, mDividerHeight, 0);}}//绘制分割线@Overridepublic void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {super.onDraw(c, parent, state);if (mOrientation == LinearLayoutManager.VERTICAL) {drawVertical(c, parent);} else {drawHorizontal(c, parent);}}/*** 绘制纵向列表时的分隔线  这时分隔线是横着的* 每次 left相同,top根据child变化,right相同,bottom也变化* @param canvas* @param parent*/private void drawVertical(Canvas canvas, RecyclerView parent) {final int left = parent.getPaddingLeft();final int right = parent.getMeasuredWidth() - parent.getPaddingRight();final int childSize = parent.getChildCount();for (int i = 0; i < childSize; i++) {final View child = parent.getChildAt(i);RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();final int top = child.getBottom() + layoutParams.bottomMargin;final int bottom = top + mDividerHeight;if (mDivider != null) {mDivider.setBounds(left + mOffsetLeft, top, right - mOffsetRight, bottom);mDivider.draw(canvas);}if (mPaint != null) {canvas.drawRect(left + mOffsetLeft, top, right - mOffsetRight, bottom, mPaint);}}}/*** 绘制横向列表时的分隔线  这时分隔线是竖着的* l、r 变化; t、b 不变* @param canvas* @param parent*/private void drawHorizontal(Canvas canvas, RecyclerView parent) {final int top = parent.getPaddingTop();final int bottom = parent.getMeasuredHeight() - parent.getPaddingBottom();final int childSize = parent.getChildCount();for (int i = 0; i < childSize; i++) {final View child = parent.getChildAt(i);RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();final int left = child.getRight() + layoutParams.rightMargin;final int right = left + mDividerHeight;if (mDivider != null) {mDivider.setBounds(left, top, right, bottom);mDivider.draw(canvas);}if (mPaint != null) {canvas.drawRect(left, top, right, bottom, mPaint);}}}
}

当然也有更简单的方法,使用shape资源文件,不需要写java代码,适用于简单的分割线,效果如下:

但是不好的地方是,无法调整距离左右边距,或者是使用姿势不对?

使用方法:

//添加自定义分割线DividerItemDecoration divider = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);divider.setDrawable(ContextCompat.getDrawable(this,R.drawable.divider_mileage));mRecyclerView.addItemDecoration(divider);

自定义的分割线的文件,在drawable/divider_mileage.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><size android:height="20dp" /><solid android:color="#30c2b1" /><!-- 不起作用?--><paddingandroid:left="64dp"android:bottom="64dp"android:right="64dp"android:top="64dp" /></shape>

上面整个项目地址:https://github.com/buder-cp/base_component_learn/tree/master/self_divider

万能RecyclerView分割线扩展相关推荐

  1. RecyclerView分割线的技巧

    RecyclerView分割线的技巧 真的很简单,因为方法别人都已经写好了,不多说了还是看源码: package com.xiayiye.yhsh.recyclerviewdemo;import an ...

  2. RecyclerView分割线

    闲来无事,把自己弄的一个RecyclerView分割线,整理一下,贴上来,当做笔记,方便自己以后查看. 使用方法: 一.添加默认分割线:默认纵向布局.高度为2.灰色, rv.addItemDecora ...

  3. Android 活用RecyclerView分割线

    1.ItemDecoration简介 Recyclerview是我们日常开发中使用频率比较高的的控件,而其中的ItemDecoration作为布局装饰又能很方便的帮助我们定义分割线,列表排行效果以及设 ...

  4. Android零基础入门第65节:RecyclerView分割线开发技巧

    2019独角兽企业重金招聘Python工程师标准>>> 在上一期通过简单学习,已经领略到了RecyclerView的灵活性,当然都是一些最基础的用法,那么本期一起来学习Recycle ...

  5. 3升5升得4升——倒水问题的万能解法(扩展欧几里得算法)

    扩展欧几里得算法及其应用 问题:假设你有一个3升的容器和一个5升的容器(以及充足的水源),如何精确地取出4升水来?(为了下文叙述的方便,我们不妨把3升的容器和5升的容器分别记做容器A和容器B).这里提 ...

  6. RecyclerView --- 分割线

    [记录]记录点滴 [需求]简单使用分割线与自定义分割线 1. 利用DividerItemDecoration, 简单实现分割线 2. 基于RecyclerView.ItemDecoration,自定义 ...

  7. RecyclerView 分割线和 Item默认增删动画

    虽然RecyclerView出现已经有一段时间了,但是还是想要自己总结一下,总的来说其基本使用方法: 你想要控制其显示的方式,请通过布局管理器LayoutManager; 你想要控制Item间的间隔( ...

  8. android vlayout 阿里,Android阿里巴巴推出RecyclerView得扩展库vlayout

    效果图: 项目结构: 引用库 // gradlecompile ('com.alibaba.android:vlayout:1.0.1@aar') { transitive = true} MainA ...

  9. 一个漂亮而强大的RecyclerView

    代码地址如下: http://www.demodashi.com/demo/13470.html 简介 主要提供了简单易用强大的RecyclerView库,包括自定义刷新加载效果.极简通用的万能适配器 ...

最新文章

  1. 《评人工智能如何走向新阶段》后记(再续1)
  2. 转:软件设计漫谈之三:30分钟掌握面向对象类的设计原则
  3. JAVA子类和父类在同一个包中,子类和父类在同一个包中继承性
  4. 11计算机,11-计算机科学与技术
  5. MongoDB学习笔记-06 数据库命令、固定集合、GridFS、javascript脚本
  6. js+jquery手写弹出提示框
  7. OpenCV-Python实战(番外篇)——OpenCV、NumPy和Matplotlib直方图比较
  8. Assembly.CreateInstance()与Activator.CreateInstanc
  9. node.js 知识分享网站源码【毕业设计】
  10. Win10常用快捷键
  11. PLC开发没有前景想转行嵌入式,找个培训机构还是自学?
  12. C语言也能干大事第十二节(如鹏基础)
  13. bzoj3332 旧试题 [最大生成树]
  14. 程序员培训班一般要多少钱?
  15. c语言三角函数例题,三角函数的诱导公式习题及答案解析.doc
  16. 回顾一年的IT学习历程与大学生活
  17. 【NDN实验】ndnSIM: NDN simulator for NS-3 全文翻译
  18. week8—多线程下载多个网页文件
  19. 失传万年的PS致富经典(九)
  20. :before和::before是什么区别

热门文章

  1. 软工实践第二次作业之个人项目
  2. 网页显示高德地图例子
  3. matlab数据接口技术,Matlab与Pspice的数据接口技术
  4. MThings连接移动OneNet物联网平台
  5. 电感的能量储存在哪里-深度解析(4)
  6. 武汉理工大龙芯计算机学院2000级,以我心造“龙芯”,计算机学院两支战队在全国赛事中崭露头角...
  7. 准备走上共享软件之路,出师不利,两块石头石沉大海,我打算流了她们。
  8. 最美翻译官(适配器模式)
  9. linux防火墙放开pptpd端口号,centos7 安装pptpd(使用iptbales防火墙)
  10. 【CSS】自定义平台文章封面图