参考后修改的,参考源暂时找不到了,非常感谢大神当年的帮助。
RecyclerView 的分割线可以通过item 布局去画,但是这样效率太低了,想在百度上找一篇用着舒爽的文章又太难了。
下面请看懒人分享第二章:万能分割线。
//使用方法:
//参数分别是 上下文、宽度、颜色
rvMy.addItemDecoration(
new DividerItemDecoration(
getMyActivity(), 3, 0xffdddddd)
);
*****************************************************************
//自定义分割
public class DividerItemDecoration extends BaseDividerItemDecoration {
public DividerItemDecoration(Context context,
int lineWidthDp, @ColorInt int colorRGB) {
super(context, lineWidthDp, colorRGB);
}
@Override
public boolean[] getItemSidesIsHaveOffsets(int itemPosition) {
//顺时针顺序:left, top, right, bottom
boolean[] isOffset = {false, false, true, true};
//默认只有bottom显示分割线
return isOffset;
}
}
//工具代码
*******************************************************************
package com.xdx.hostay.customer;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.support.annotation.ColorInt;
import android.support.v7.widget.RecyclerView;
import android.view.View;
/**
* Created by biyunlong on 2017/5/17.
* Make progress every day
*/
public abstract class BaseDividerItemDecoration extends RecyclerView.ItemDecoration {
private Paint mPaint;
private int lineWidth;//px 分割线宽
/**
* A single color value in the form 0xAARRGGBB.
**/
private int colorRGB;
public BaseDividerItemDecoration(Context context, float lineWidthDp, @ColorInt int colorRGB) {
this.colorRGB = colorRGB;
// this.lineWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, lineWidthDp, context.getResources().getDisplayMetrics());
this.lineWidth= (int) lineWidthDp;
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(colorRGB);
mPaint.setStyle(Paint.Style.FILL);
}
public BaseDividerItemDecoration(Context context, int lineWidthDp, @ColorInt int colorRGB) {
this.colorRGB = colorRGB;
this.lineWidth= lineWidthDp;
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(colorRGB);
mPaint.setStyle(Paint.Style.FILL);
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
int childCount1 = parent.getChildCount();
for (int i = 0; i < childCount1; i++) {
View child = parent.getChildAt(i);
int itemPosition = ((RecyclerView.LayoutParams) child.getLayoutParams()).getViewLayoutPosition();
boolean[] sideOffsetBooleans = getItemSidesIsHaveOffsets(itemPosition);
if (sideOffsetBooleans[0]) {
drawChildLeftVertical(child, c, parent);
}
if (sideOffsetBooleans[1]) {
drawChildTopHorizontal(child, c, parent);
}
if (sideOffsetBooleans[2]) {
drawChildRightVertical(child, c, parent);
}
if (sideOffsetBooleans[3]) {
drawChildBottomHorizontal(child, c, parent);
}
}
}
private void drawChildBottomHorizontal(View child, Canvas c, RecyclerView parent) {
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
int left = child.getLeft() - params.leftMargin - lineWidth;
int right = child.getRight() + params.rightMargin + lineWidth;
int top = child.getBottom() + params.bottomMargin;
int bottom = top + lineWidth;
c.drawRect(left, top, right, bottom, mPaint);
}
private void drawChildTopHorizontal(View child, Canvas c, RecyclerView parent) {
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
int left = child.getLeft() - params.leftMargin - lineWidth;
int right = child.getRight() + params.rightMargin + lineWidth;
int bottom = child.getTop() - params.topMargin;
int top = bottom - lineWidth;
c.drawRect(left, top, right, bottom, mPaint);
}
private void drawChildLeftVertical(View child, Canvas c, RecyclerView parent) {
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
int top = child.getTop() - params.topMargin - lineWidth;
int bottom = child.getBottom() + params.bottomMargin + lineWidth;
int right = child.getLeft() - params.leftMargin;
int left = right - lineWidth;
c.drawRect(left, top, right, bottom, mPaint);
}
private void drawChildRightVertical(View child, Canvas c, RecyclerView parent) {
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
int top = child.getTop() - params.topMargin - lineWidth;
int bottom = child.getBottom() + params.bottomMargin + lineWidth;
int left = child.getRight() + params.rightMargin;
int right = left + lineWidth;
c.drawRect(left, top, right, bottom, mPaint);
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
//outRect 看源码可知这里只是把Rect类型的outRect作为一个封装了left,right,top,bottom的数据结构,
//作为传递left,right,top,bottom的偏移值来用的
int itemPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition();
//
boolean[] sideOffsetBooleans = getItemSidesIsHaveOffsets(itemPosition);
int left = sideOffsetBooleans[0] ? lineWidth : 0;
int top = sideOffsetBooleans[1] ? lineWidth : 0;
int right = sideOffsetBooleans[2] ? lineWidth : 0;
int bottom = sideOffsetBooleans[3] ? lineWidth : 0;
outRect.set(left, top, right, bottom);
}
/**
* 顺序:left, top, right, bottom
*
* @return boolean[4]
*/
public abstract boolean[] getItemSidesIsHaveOffsets(int itemPosition);
}