您的位置:首页 > 移动开发 > Android开发

一个Android RecyclerView万能分割线

2017-04-24 13:16 417 查看
/*** Created by 杨俊才 on 2016/11/24.*  recycleview万能分割线*/public class YangRecycleViewDivider 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 leftMagin;private int rightMagin;/*** 默认分割线:高度为2px,颜色为灰色** @param context* @param orientation 列表方向*/public YangRecycleViewDivider(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 YangRecycleViewDivider(Context context, int orientation, int drawableId) {this(context, orientation);mDivider = ContextCompat.getDrawable(context, drawableId);mDividerHeight = mDivider.getIntrinsicHeight();}/*** 自定义分割线** @param context* @param orientation   列表方向* @param dividerHeight 分割线高度* @param dividerColor  分割线颜色*/public YangRecycleViewDivider(Context context, int orientation, int dividerHeight, int dividerColor, int leftMagin, int rightMagin) {this(context, orientation);this.leftMagin = leftMagin;this.rightMagin = rightMagin;mDividerHeight = dividerHeight;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);outRect.set(0, 0, 0, mDividerHeight);}//绘制分割线@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);}}//绘制横向 item 分割线private void drawHorizontal(Canvas canvas, RecyclerView parent) {final int left = parent.getPaddingLeft() + leftMagin;final int right = parent.getMeasuredWidth() - parent.getPaddingRight()-rightMagin;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 (i!=childSize-1){if (mDivider != null) {mDivider.setBounds(left, top, right, bottom);mDivider.draw(canvas);}if (mPaint != null) {canvas.drawRect(left, top, right, bottom, mPaint);}}else {//最后一个item下边没有线}}}//绘制纵向 item 分割线private void drawVertical(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);}}}}
用法1:recyclerView.addItemDecoration(new YangRecycleViewDivider(this, LinearLayoutManager.HORIZONTAL, dip2px(this, 1), getResources().getColor(R.color.red), dip2px(this, 10), dip2px(this, 0)));用法2:使用另一个构造器 ,直接使用图片
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息