Android(安卓)RecyclerView 设置分割线(item头部也绘制)
16lz
2021-01-26
查了下资料,RecyclerView的分割线网上资料很多
但是头部也绘制的分割线资料挺少
于是参考一下资料自己弄一个头部也绘制的分割线
LinearLayout的分割线DividerItemDecoration
public class DividerItemDecoration extends RecyclerView.ItemDecoration { private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; private Drawable mDivider; /** * Default divider will be used */ public DividerItemDecoration(Context context) { final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS); mDivider = styledAttributes.getDrawable(0); styledAttributes.recycle(); } /** * Custom divider will be used */ public DividerItemDecoration(Context context, int resId) { mDivider = ContextCompat.getDrawable(context, resId); } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { int column_num = getSpanCount(parent); int left = parent.getPaddingLeft(); int right = parent.getWidth() - parent.getPaddingRight(); int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); int top = 0; int bottom = 0; //根据item的数量判断是否为第一个 if (i / column_num == 0) { //画item最上面的分割线 top = 0; bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); //画item下面的分割线 top = child.getBottom() + params.bottomMargin; bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } else { //画item下面的分割线 top = child.getBottom() + params.bottomMargin; bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } } private int getSpanCount(RecyclerView parent) { // 获取列数 int spanCount = -1; RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { spanCount = ((GridLayoutManager) layoutManager).getSpanCount(); } else if (layoutManager instanceof StaggeredGridLayoutManager) { spanCount = ((StaggeredGridLayoutManager) layoutManager) .getSpanCount(); } return spanCount; }}
GridLayout的分割线DividerGridItemDecoration
这个是参考这个的RecyclerView中利用GridLayoutManager实现item四周都带有分割线效果
public class DividerGridItemDecoration extends RecyclerView.ItemDecoration { private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; private Drawable mDivider; public DividerGridItemDecoration(Context context) { final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); a.recycle(); } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { drawHorizontal(c, parent); drawVertical(c, parent); } private int getSpanCount(RecyclerView parent) { // 列数 int spanCount = -1; RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { spanCount = ((GridLayoutManager) layoutManager).getSpanCount(); } else if (layoutManager instanceof StaggeredGridLayoutManager) { spanCount = ((StaggeredGridLayoutManager) layoutManager) .getSpanCount(); } return spanCount; } public void drawHorizontal(Canvas c, RecyclerView parent) { int childCount = parent.getChildCount(); int column_num = getSpanCount(parent); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int left = child.getLeft() - params.leftMargin; final int right = child.getRight() + params.rightMargin + mDivider.getIntrinsicWidth();// final int top = child.getBottom() + params.bottomMargin;// final int bottom = top + mDivider.getIntrinsicHeight();// mDivider.setBounds(left, top, right, bottom);// mDivider.draw(c); int top = 0; int bottom = 0; if ((i / column_num) == 0) { //画item最上面的分割线 top = 0; bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); //画item下面的分割线 top = child.getBottom() + params.bottomMargin; bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } else { //画item下面的分割线 top = child.getBottom() + params.bottomMargin; bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } }} public void drawVertical(Canvas c, RecyclerView parent) { final int childCount = parent.getChildCount(); int column_num = getSpanCount(parent); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int top = child.getTop() - params.topMargin; final int bottom = child.getBottom() + params.bottomMargin;// final int left = child.getRight() + params.rightMargin;// final int right = left + mDivider.getIntrinsicWidth();// mDivider.setBounds(left, top, right, bottom);// mDivider.draw(c); int left = 0; int right = 0; if ((i % column_num) == 0) { //item左边分割线 left = 0; right = left + mDivider.getIntrinsicWidth(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); //item右边分割线 left = child.getRight() + params.rightMargin; right = left + mDivider.getIntrinsicWidth(); } else { left = child.getRight() + params.rightMargin; right = left + mDivider.getIntrinsicWidth(); } mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } private boolean isLastColum(RecyclerView parent, int pos, int spanCount, int childCount) { RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) {// // 如果是最后一列,则不需要绘制右边// if ((pos + 1) % spanCount == 0) {// return true;// } } else if (layoutManager instanceof StaggeredGridLayoutManager) { int orientation = ((StaggeredGridLayoutManager) layoutManager) .getOrientation(); if (orientation == StaggeredGridLayoutManager.VERTICAL) { // 如果是最后一列,则不需要绘制右边 if ((pos + 1) % spanCount == 0) { return true; } } else { childCount = childCount - childCount % spanCount; if (pos >= childCount)// 如果是最后一列,则不需要绘制右边 return true; } } return false; } private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, int childCount) { RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) {// childCount = childCount - childCount % spanCount;// if (pos >= childCount)// 如果是最后一行,则不需要绘制底部// return true; } else if (layoutManager instanceof StaggeredGridLayoutManager) { int orientation = ((StaggeredGridLayoutManager) layoutManager) .getOrientation(); // StaggeredGridLayoutManager 且纵向滚动 if (orientation == StaggeredGridLayoutManager.VERTICAL) { childCount = childCount - childCount % spanCount; if (pos >= childCount)// 如果是最后一行,则不需要绘制底部 return true; // StaggeredGridLayoutManager 且横向滚动 } else { // 如果是最后一行,则不需要绘制底部 if ((pos + 1) % spanCount == 0) { return true; } } } return false; } @Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { int spanCount = getSpanCount(parent); int childCount = parent.getAdapter().getItemCount(); // 如果是最后一行,则不需要绘制底部 if (isLastRaw(parent, itemPosition, spanCount, childCount)) { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); // 如果是最后一列,则不需要绘制右边 } else if (isLastColum(parent, itemPosition, spanCount, childCount)) { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(), mDivider.getIntrinsicHeight()); } }}
更多相关文章
- [Android] 开发资料收集:性能优化
- Android刮奖控件,需要的直接拿去用
- Android(安卓)Studio中使用simpleUML绘制类图详细使用及说明
- Android(安卓)中显示 Gif 格式图
- android paint类
- Android的手势的保存
- Android(安卓)P在绘制界面时,默认更换skiagl绘图库绘制界面
- android canvas 绘制bitmap并保存到本地
- android自定义View-垂直滚动的TextView