Android(安卓)RecyclerView设置分割线
16lz
2021-01-26
1、设置分割线代码
public class GridDividerItemDecoration extends RecyclerView.ItemDecoration { private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; private Drawable mDivider; public GridDividerItemDecoration(Context context) { final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); //自定义分割线颜色值 mDivider = AppCompatResources.getDrawable(context, R.color.ee_to_353); 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(); } return spanCount; } /*** * 绘制水平分割线 * @param c * @param parent */ public void drawHorizontal(Canvas c, RecyclerView parent) { int childCount = parent.getChildCount(); 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); } } /** * 绘制垂直线 * * @param c * @param parent */ public void drawVertical(Canvas c, RecyclerView parent) { final int childCount = parent.getChildCount(); //这里固定了,最后一个不用线条 if (childCount <= 0) { return; } for (int i = 0; i < childCount - 1; 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, 100, right + 2, bottom - 100); mDivider.draw(c); } } /** * 是否是最后一行 */ private boolean isLastRow(int itemPosition, RecyclerView parent) { int spanCount = getSpanCount(parent); RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); //有多少列 if (layoutManager instanceof GridLayoutManager) { int childCount = parent.getAdapter().getItemCount(); double count = Math.ceil((double) childCount / (double) spanCount);//总行数 double currentCount = Math.ceil((double) (itemPosition + 1) / spanCount);//当前行数 //最后当前数量小于总的 if (currentCount < count) { return false; } } return true; } /** * 判断是否是最后一列 */ private boolean isLastColum(int itemPosition, RecyclerView parent) { RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); //有多少列 if (layoutManager instanceof GridLayoutManager) { int spanCount = getSpanCount(parent); //因为是从0可以所以要将ItemPosition先加1 if ((itemPosition + 1) % spanCount == 0) { return true; } } return false; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); // 如果是最后一行,则不需要绘制底 if (isLastRow(parent.getChildLayoutPosition(view), parent)) { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } // 如果是最后一列,则不需要绘制右边 if (isLastColum(parent.getChildLayoutPosition(view), parent)) { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } }}
2、调用
GridLayoutManager manager = new GridLayoutManager(getContext(),3); recyclerView.setLayoutManager(manager); GridDividerItemDecoration decoration = new GridDividerItemDecoration(getContext()); recyclerView.addItemDecoration(decoration);
更多相关文章
- android自定义View绘制几何图形
- 手写功能,撤回上一步,清空,保存 功能
- OpenGl-ES2.0 For Android(安卓)读书笔记(一)
- android虚拟键盘实现
- Android使用SurfaceView画图
- TextView源码解析-----绘制过程
- 自定义开关控件(ToggleView)继承View实现
- miui卸载爆炸效果
- Drawables:9-patch