转载请表明出处
新建RecyclerViewDivider继承RecyclerView.ItemDecoration(这里我只列举了几种构造方法,需要的话可以自己添加方法)
public class RecyclerViewDivider extends RecyclerView.ItemDecoration {
private Paint mPaint; //画笔
private Drawable drawable; //分割线图片
private int mOrientation; //列表方向 LinearLayoutManager.HORIZONTAL:横向(列表为纵向)
private int mDividerHeight; //分割线高度
private static final int[] ATTRS = {android.R.attr.listDivider};
/**
* 默认分割线样式 无颜色 高度1
*
* @param context
* @param mOrientation
*/
public RecyclerViewDivider(Context context, int mOrientation) {
if (mOrientation != LinearLayoutManager.HORIZONTAL && mOrientation != LinearLayoutManager.VERTICAL)
throw new IllegalArgumentException("请输入正确参数~");
this.mOrientation = mOrientation;
mDividerHeight = DensityUtil.dpToPx(context, 1);
final TypedArray a = context.obtainStyledAttributes(ATTRS);
drawable = a.getDrawable(0);
a.recycle();
}
/**
* 默认分割线样式 无颜色 高度自定义
* @param context
* @param mOrientation
* @param dividerHeight
*/
public RecyclerViewDivider(Context context, int mOrientation, int dividerHeight) {
this(context, mOrientation);
mDividerHeight = DensityUtil.dpToPx(context, dividerHeight);
}
/**
* 自定义分割线类型 图片
*
* @param context
* @param mOrientation
* @param drawableId
*/
// public RecyclerViewDivider(Context context, int mOrientation, int drawableId) {
// this(context, mOrientation);
// drawable = ContextCompat.getDrawable(context, drawableId);
// mDividerHeight = drawable.getIntrinsicHeight();
// }
/**
* 自定义分割线类型 高度 颜色
*
* @param context
* @param mOrientation
* @param dividerHeight
* @param dividerColor
*/
public RecyclerViewDivider(Context context, int mOrientation, int dividerHeight, int dividerColor) {
this(context, mOrientation);
mDividerHeight = DensityUtil.dpToPx(context, dividerHeight);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); //抗锯齿
mPaint.setColor(dividerColor);
mPaint.setStyle(Paint.Style.FILL);
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
//获取当前item位置
int childAdapterPosition = parent.getChildAdapterPosition(view);
//获取最有一个item位置
int lastCount = parent.getAdapter().getItemCount() - 1;
//如果当前条目与是最后一个条目,就不设置divider padding
if (childAdapterPosition == lastCount) {
outRect.set(0, 0, 0, 0);
return;
}
//以上代码是实现最后一个item的底部不添加分割线
if (mOrientation == LinearLayoutManager.HORIZONTAL)
outRect.set(0, 0, 0, mDividerHeight);
else
outRect.set(0, 0, mDividerHeight, 0);
}
@Override
public 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);
}
private void drawHorizontal(Canvas canvas, RecyclerView parent) {
//获取到分割线左右边界的位置
final int left = parent.getPaddingLeft();
final int right = parent.getMeasuredWidth() - parent.getPaddingRight();
final int childSize = parent.getChildCount();
//获取到recyclerview每个item
for (int i = 0; i < childSize; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
//获取到分割线上下边界的位置
int top = child.getBottom() + layoutParams.bottomMargin;
int bottom = top + mDividerHeight;
//此处的判断是为了最底下的一个item不显示分割线
if (i != childSize - 1) {
if (drawable != null) {
drawable.setBounds(left, top, right, bottom);
drawable.draw(canvas);
}
if (mPaint != null)
canvas.drawRect(left, top, right, bottom, mPaint);
}
}
}
public void drawVertical(Canvas canvas, RecyclerView parent) {
//获取到分割线上下边界的位置
final int top = parent.getPaddingTop();
final int bottom = parent.getMeasuredHeight() - parent.getPaddingBottom();
final int childCount = parent.getChildCount();
//获取到recyclerview每个item
for (int i = 0; i < childCount; i++) {
View view = parent.getChildAt(i);
RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) view.getLayoutParams();
//获取到分割线左右边界的位置
int left = parent.getRight() + layoutParams.rightMargin;
int right = left + mDividerHeight;
//此处的判断是为了最底下的一个item不显示分割线
if (i != childCount - 1) {
if (drawable != null) {
drawable.setBounds(left, top, right, bottom);
drawable.draw(canvas);
}
if (mPaint != null)
canvas.drawRect(left, top, right, bottom, mPaint);
}
}
}
}
然后只需要在recyclerview.setAdapter()之前调用 recyclerview.addItemDecoration(new RecyclerViewDivider(context, LinearLayoutManager.VERTICAL, height));
荆轲刺秦王