【Android】【RecyclerView】各种LayoutManager划分割线
来源:互联网 发布:手机淘宝网 编辑:程序博客网 时间:2024/06/04 19:12
RecyClerView的各种分割线,List,Grid,Staggered,垂直和水平
1.LIST
public class ListDividerItemDecoration extends RecyclerView.ItemDecoration { private int[] attrs = new int[]{ android.R.attr.listDivider }; public static final int DIRECTION_VERTICAL = 0; public static final int DIRECTION_HORIZONTAL = 1; private Drawable divider; private int direction; public ListDividerItemDecoration(Context context, int direction) { super(); TypedArray typedArray = context.obtainStyledAttributes(attrs); divider = typedArray.getDrawable(0); this.direction = direction; } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDraw(c, parent, state); if (divider == null) return; if (direction == DIRECTION_VERTICAL) { drawVerticalDivider(c, parent); } else { drawHoriziontalDivider(c, parent); } } private void drawHoriziontalDivider(Canvas c, RecyclerView parent) { int left = 0; int top = 0; int right =0; int bottom = 0; top = parent.getPaddingTop(); bottom = parent.getHeight() - parent.getPaddingBottom(); for (int i = 0; i < parent.getChildCount(); i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams(); left = child.getRight()+layoutParams.rightMargin; right = left + divider.getIntrinsicWidth(); divider.setBounds(left, top, right, bottom); divider.draw(c); } } private void drawVerticalDivider(Canvas c, RecyclerView parent) { int left = 0; int top = 0; int right =0; int bottom = 0; left = parent.getPaddingLeft(); right = parent.getWidth() - parent.getPaddingRight(); for (int i = 0; i < parent.getChildCount(); i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams(); top = child.getBottom()+layoutParams.bottomMargin; bottom = top + divider.getIntrinsicHeight(); divider.setBounds(left, top, right, bottom); divider.draw(c); } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { System.out.println("divider:" + divider.getIntrinsicHeight() + " " + divider.getIntrinsicWidth()); int p = parent.getChildAdapterPosition(view); int p1 = parent.getChildLayoutPosition(view); System.out.println("p:" + p + " p1:" + p1); if (direction == DIRECTION_VERTICAL) { if (parent.getChildLayoutPosition(view) == 0) { outRect.set(0, 0, 0, 0); } else { outRect.set(0, divider.getIntrinsicHeight(), 0, 0); } } else { if (parent.getChildLayoutPosition(view) == 0) { outRect.set(0, 0, 0, 0); } else { outRect.set(divider.getIntrinsicWidth(), 0, 0, 0); } } }}
2.GRID
public class GridDividerItemDecoration extends RecyclerView.ItemDecoration { private int[] attrs = new int[]{ android.R.attr.listDivider }; public static final int DIRECTION_VERTICAL = 0; public static final int DIRECTION_HORIZONTAL = 1; private Drawable divider; private int direction; private final int column; public GridDividerItemDecoration(Context context, int direction, int column) { super(); TypedArray typedArray = context.obtainStyledAttributes(attrs); divider = typedArray.getDrawable(0); this.direction = direction; this.column = column; } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDraw(c, parent, state); if (divider == null) return; if (direction == DIRECTION_VERTICAL) { drawVerticalDivider(c, parent); } else { drawHoriziontalDivider(c, parent); } } private void drawHoriziontalDivider(Canvas c, RecyclerView parent) { int left = 0; int top = 0; int right = 0; int bottom = 0; for (int i = 0; i < parent.getChildCount(); i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams(); //头部第一条线 if (i % column == 0) { top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight(); bottom = top + divider.getIntrinsicHeight(); left = child.getLeft() - layoutParams.leftMargin; right = child.getRight() + layoutParams.rightMargin; divider.setBounds(left, top, right, bottom); divider.draw(c); } //最右边的线 if (i >= parent.getChildCount() - column) { top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight(); bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight(); left = child.getRight() + layoutParams.rightMargin; right = left + divider.getIntrinsicWidth(); divider.setBounds(left, top, right, bottom); divider.draw(c); } //最后一个补线// if(i==parent.getChildCount()-1&&(i + 1) % column!=0){// top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();// bottom = child.getBottom() + layoutParams.bottomMargin+divider.getIntrinsicHeight();// left = child.getRight() + layoutParams.rightMargin;// right = left + divider.getIntrinsicWidth();// divider.setBounds(left, top, right, bottom);// divider.draw(c);//// } //左边的线 top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight(); bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight(); left = child.getLeft() - layoutParams.leftMargin - divider.getIntrinsicWidth(); right = left + divider.getIntrinsicWidth(); divider.setBounds(left, top, right, bottom); divider.draw(c); //下面的线 top = child.getBottom() + layoutParams.bottomMargin; bottom = top + divider.getIntrinsicHeight(); left = child.getLeft() - layoutParams.leftMargin; right = child.getRight() + layoutParams.rightMargin; divider.setBounds(left, top, right, bottom); divider.draw(c); } } private void drawVerticalDivider(Canvas c, RecyclerView parent) { int left = 0; int top = 0; int right = 0; int bottom = 0; for (int i = 0; i < parent.getChildCount(); i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams(); //头部第一条线 if (i / column == 0) { top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight(); bottom = top + divider.getIntrinsicHeight(); left = child.getLeft() - layoutParams.leftMargin; right = child.getRight() + layoutParams.rightMargin; divider.setBounds(left, top, right, bottom); divider.draw(c); } //最右边的线 if ((i + 1) % column == 0) { top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight(); bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight(); left = child.getRight() + layoutParams.rightMargin; right = left + divider.getIntrinsicWidth(); divider.setBounds(left, top, right, bottom); divider.draw(c); } //最后一个补线 if (i == parent.getChildCount() - 1 && (i + 1) % column != 0) { top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight(); bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight(); left = child.getRight() + layoutParams.rightMargin; right = left + divider.getIntrinsicWidth(); divider.setBounds(left, top, right, bottom); divider.draw(c); } //左边的线 top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight(); bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight(); left = child.getLeft() - layoutParams.leftMargin - divider.getIntrinsicWidth(); right = left + divider.getIntrinsicWidth(); divider.setBounds(left, top, right, bottom); divider.draw(c); //下面的线 top = child.getBottom() + layoutParams.bottomMargin; bottom = top + divider.getIntrinsicHeight(); left = child.getLeft() - layoutParams.leftMargin; right = child.getRight() + layoutParams.rightMargin; divider.setBounds(left, top, right, bottom); divider.draw(c); } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { System.out.println("divider:" + divider.getIntrinsicHeight() + " " + divider.getIntrinsicWidth()); int p = parent.getChildAdapterPosition(view); int p1 = parent.getChildLayoutPosition(view); int left = 0; int top = 0; int right = 0; int bottom = 0; System.out.println("p:" + p + " p1:" + p1); if (direction == DIRECTION_VERTICAL) { int position = parent.getChildLayoutPosition(view); if (position / column == 0) top = divider.getIntrinsicHeight(); if ((position + 1) % column == 0) right = divider.getIntrinsicWidth(); left = divider.getIntrinsicWidth(); bottom = divider.getIntrinsicHeight(); outRect.set(left, top, right, bottom); } else { int position = parent.getChildLayoutPosition(view); if (position / column == 0) left = divider.getIntrinsicWidth(); if (position % column == 0) top = divider.getIntrinsicHeight(); right = divider.getIntrinsicWidth(); bottom = divider.getIntrinsicHeight(); outRect.set(left, top, right, bottom); } }}
3. STAGGERED
public class StaggeredDividerItemDecoration extends RecyclerView.ItemDecoration { private int[] attrs = new int[]{ android.R.attr.listDivider }; public static final int DIRECTION_VERTICAL = 0; public static final int DIRECTION_HORIZONTAL = 1; private Drawable divider; private int direction; private final int column; public StaggeredDividerItemDecoration(Context context, int direction, int column) { super(); TypedArray typedArray = context.obtainStyledAttributes(attrs); divider = typedArray.getDrawable(0); this.direction = direction; this.column = column; } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { System.out.println("onDraw" + state.toString()); super.onDraw(c, parent, state); if (divider == null) return; if (direction == DIRECTION_VERTICAL) { drawVerticalDivider(c, parent); } else { drawHoriziontalDivider(c, parent); } } private void drawHoriziontalDivider(Canvas c, RecyclerView parent) { int left = 0; int top = 0; int right = 0; int bottom = 0; for (int i = 0; i < parent.getChildCount(); i++) { View child = parent.getChildAt(i); int position = ((StaggeredGridLayoutManager.LayoutParams) child.getLayoutParams()).getSpanIndex(); RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams(); //头部第一条线 if (position == 0) { top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight(); bottom = top + divider.getIntrinsicHeight(); left = child.getLeft() - layoutParams.leftMargin; right = child.getRight() + layoutParams.rightMargin; divider.setBounds(left, top, right, bottom); divider.draw(c); } //最右边的线 if (i >= parent.getChildCount() - column) { top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight(); bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight(); left = child.getRight() + layoutParams.rightMargin; right = left + divider.getIntrinsicWidth(); divider.setBounds(left, top, right, bottom); divider.draw(c); } //最后一个补线 if(i>=parent.getChildCount()-column&&position!=0){ top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight(); bottom = top + divider.getIntrinsicHeight(); left = child.getLeft() - layoutParams.leftMargin; right = child.getRight() + layoutParams.rightMargin; divider.setBounds(left, top, right, bottom); divider.draw(c); } //左边的线 top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight(); bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight(); left = child.getLeft() - layoutParams.leftMargin - divider.getIntrinsicWidth(); right = left + divider.getIntrinsicWidth(); divider.setBounds(left, top, right, bottom); divider.draw(c); //下面的线 top = child.getBottom() + layoutParams.bottomMargin; bottom = top + divider.getIntrinsicHeight(); left = child.getLeft() - layoutParams.leftMargin; right = child.getRight() + layoutParams.rightMargin; divider.setBounds(left, top, right, bottom); divider.draw(c); } } private void drawVerticalDivider(Canvas c, RecyclerView parent) { int left = 0; int top = 0; int right = 0; int bottom = 0; for (int i = 0; i < parent.getChildCount(); i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams(); int position = ((StaggeredGridLayoutManager.LayoutParams) child.getLayoutParams()).getSpanIndex(); //头部第一条线 if (i / column == 0) { top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight(); bottom = top + divider.getIntrinsicHeight(); left = child.getLeft() - layoutParams.leftMargin; right = child.getRight() + layoutParams.rightMargin; divider.setBounds(left, top, right, bottom); divider.draw(c); } //最右边的线 if (position == column - 1) { top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight(); bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight(); left = child.getRight() + layoutParams.rightMargin; right = left + divider.getIntrinsicWidth(); divider.setBounds(left, top, right, bottom); divider.draw(c); } //最后一个补线 if (i>=parent.getChildCount()-column&&position!=2) { top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight(); bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight(); left = child.getRight() + layoutParams.rightMargin; right = left + divider.getIntrinsicWidth(); divider.setBounds(left, top, right, bottom); divider.draw(c); } //左边的线 top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight(); bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight(); left = child.getLeft() - layoutParams.leftMargin - divider.getIntrinsicWidth(); right = left + divider.getIntrinsicWidth(); divider.setBounds(left, top, right, bottom); divider.draw(c); //下面的线 top = child.getBottom() + layoutParams.bottomMargin; bottom = top + divider.getIntrinsicHeight(); left = child.getLeft() - layoutParams.leftMargin; right = child.getRight() + layoutParams.rightMargin; divider.setBounds(left, top, right, bottom); divider.draw(c); } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { final StaggeredGridLayoutManager.LayoutParams slp = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams(); int p2 = slp.getSpanIndex(); System.out.println("p2:" + p2); System.out.println("divider:" + divider.getIntrinsicHeight() + " " + divider.getIntrinsicWidth()); int p = parent.getChildAdapterPosition(view); int p1 = parent.getChildLayoutPosition(view); int left = 0; int top = 0; int right = 0; int bottom = 0; System.out.println("p:" + p + " p1:" + p1 + state.toString()); if (direction == DIRECTION_VERTICAL) { int position = parent.getChildLayoutPosition(view); if (position / column == 0) top = divider.getIntrinsicHeight(); if (p2 == column - 1) { right = divider.getIntrinsicWidth(); System.out.println("p:p:p" + p); } left = divider.getIntrinsicWidth(); bottom = divider.getIntrinsicHeight(); outRect.set(left, top, right, bottom); } else { int position = parent.getChildLayoutPosition(view); if (position / column == 0) left = divider.getIntrinsicWidth(); if (p2 == 0) top = divider.getIntrinsicHeight(); right = divider.getIntrinsicWidth(); bottom = divider.getIntrinsicHeight(); outRect.set(left, top, right, bottom); } }}
代码不难,Copy即可用
1 0
- 【Android】【RecyclerView】各种LayoutManager划分割线
- android RecyclerView自定义 LayoutManager
- RecyclerView ---LayoutManager
- Android RecyclerView 的那些开源 LayoutManager
- Android RecyclerView的那些开源LayoutManager
- android RecyclerView自适应高度的LayoutManager
- Android Recyclerview分割线
- android recyclerview分割线
- RecyclerView复选框/各种展示/分割线
- Android RecyclerView添加分割线
- Android RecyclerView万能分割线
- Android Recyclerview 万能分割线
- Android,RecyclerView,divider,分割线
- recyclerview layoutManager Tangram 的基础 —— vlayout(Android)
- 关于Android RecyclerView的那些开源LayoutManager
- Android——RecyclerView入门学习之LayoutManager
- RecyclerView has no LayoutManager
- Recyclerview-自定义LayoutManager
- 求二维数组的鞍点
- 无论做什么,请一定要坚持,努力了,奋斗了,坚信一定可以成功!
- HTML-HEAD解析
- 1.Error:Error converting bytecode to dex:
- 关于MFC中ini的读写以及关于ini的遍历
- 【Android】【RecyclerView】各种LayoutManager划分割线
- 生产各种数据格式的sql语句
- javascript犀牛书学习笔记(一)Window对象
- Activity的四种启动方式及区别
- ubuntu16.04 下安装 QQ8.5 或者QQ8.1
- 在使用Jquery的load方法加载时,只加载第一次的问题解决方法
- 五,MyBatis动态SQL
- PHP基本语法
- li标签中,前部分标签左对齐,后部分标签右对齐