万能RecyclerView分割线扩展
该万能分割线参考自博客: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分割线扩展相关推荐
- RecyclerView分割线的技巧
RecyclerView分割线的技巧 真的很简单,因为方法别人都已经写好了,不多说了还是看源码: package com.xiayiye.yhsh.recyclerviewdemo;import an ...
- RecyclerView分割线
闲来无事,把自己弄的一个RecyclerView分割线,整理一下,贴上来,当做笔记,方便自己以后查看. 使用方法: 一.添加默认分割线:默认纵向布局.高度为2.灰色, rv.addItemDecora ...
- Android 活用RecyclerView分割线
1.ItemDecoration简介 Recyclerview是我们日常开发中使用频率比较高的的控件,而其中的ItemDecoration作为布局装饰又能很方便的帮助我们定义分割线,列表排行效果以及设 ...
- Android零基础入门第65节:RecyclerView分割线开发技巧
2019独角兽企业重金招聘Python工程师标准>>> 在上一期通过简单学习,已经领略到了RecyclerView的灵活性,当然都是一些最基础的用法,那么本期一起来学习Recycle ...
- 3升5升得4升——倒水问题的万能解法(扩展欧几里得算法)
扩展欧几里得算法及其应用 问题:假设你有一个3升的容器和一个5升的容器(以及充足的水源),如何精确地取出4升水来?(为了下文叙述的方便,我们不妨把3升的容器和5升的容器分别记做容器A和容器B).这里提 ...
- RecyclerView --- 分割线
[记录]记录点滴 [需求]简单使用分割线与自定义分割线 1. 利用DividerItemDecoration, 简单实现分割线 2. 基于RecyclerView.ItemDecoration,自定义 ...
- RecyclerView 分割线和 Item默认增删动画
虽然RecyclerView出现已经有一段时间了,但是还是想要自己总结一下,总的来说其基本使用方法: 你想要控制其显示的方式,请通过布局管理器LayoutManager; 你想要控制Item间的间隔( ...
- android vlayout 阿里,Android阿里巴巴推出RecyclerView得扩展库vlayout
效果图: 项目结构: 引用库 // gradlecompile ('com.alibaba.android:vlayout:1.0.1@aar') { transitive = true} MainA ...
- 一个漂亮而强大的RecyclerView
代码地址如下: http://www.demodashi.com/demo/13470.html 简介 主要提供了简单易用强大的RecyclerView库,包括自定义刷新加载效果.极简通用的万能适配器 ...
最新文章
- 《评人工智能如何走向新阶段》后记(再续1)
- 转:软件设计漫谈之三:30分钟掌握面向对象类的设计原则
- JAVA子类和父类在同一个包中,子类和父类在同一个包中继承性
- 11计算机,11-计算机科学与技术
- MongoDB学习笔记-06 数据库命令、固定集合、GridFS、javascript脚本
- js+jquery手写弹出提示框
- OpenCV-Python实战(番外篇)——OpenCV、NumPy和Matplotlib直方图比较
- Assembly.CreateInstance()与Activator.CreateInstanc
- node.js 知识分享网站源码【毕业设计】
- Win10常用快捷键
- PLC开发没有前景想转行嵌入式,找个培训机构还是自学?
- C语言也能干大事第十二节(如鹏基础)
- bzoj3332 旧试题 [最大生成树]
- 程序员培训班一般要多少钱?
- c语言三角函数例题,三角函数的诱导公式习题及答案解析.doc
- 回顾一年的IT学习历程与大学生活
- 【NDN实验】ndnSIM: NDN simulator for NS-3 全文翻译
- week8—多线程下载多个网页文件
- 失传万年的PS致富经典(九)
- :before和::before是什么区别
热门文章
- 软工实践第二次作业之个人项目
- 网页显示高德地图例子
- matlab数据接口技术,Matlab与Pspice的数据接口技术
- MThings连接移动OneNet物联网平台
- 电感的能量储存在哪里-深度解析(4)
- 武汉理工大龙芯计算机学院2000级,以我心造“龙芯”,计算机学院两支战队在全国赛事中崭露头角...
- 准备走上共享软件之路,出师不利,两块石头石沉大海,我打算流了她们。
- 最美翻译官(适配器模式)
- linux防火墙放开pptpd端口号,centos7 安装pptpd(使用iptbales防火墙)
- 【CSS】自定义平台文章封面图