上一篇写到recycleViewAdapter的封装,这篇文章主要是写recycleview的分割线 recycleView主要有两种模式 一种是
LinearLayoutManager 这种是跟listview一样的样式, 另一种是GridLayoutManager 这种是gridView 的样式,直接贴代码 1:第一种:之上是分割线总结,都是经过测试的,不足之处望大家一起完善。** * Created by Administrator on 2017/7/12 0012. */ public class CategoryItemDecoration extends RecyclerView.ItemDecoration{ private Drawable mDivider; public CategoryItemDecoration(Context context,int res) { // 利用Drawable绘制分割线 mDivider = ContextCompat.getDrawable(context,res); } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { int childCount = parent.getChildCount(); // 计算需要绘制的区域 //这种是在item底部画线 最后一条数据底部也有分割线 /* Rect rect = new Rect(); rect.left = parent.getPaddingLeft(); rect.right = parent.getWidth() - parent.getPaddingRight(); for (int i = 0; i < childCount; i++) { View childView = parent.getChildAt(i); rect.top = childView.getBottom(); rect.bottom = rect.top + mDivider.getIntrinsicHeight(); mDivider.setBounds(rect); // 直接利用Canvas去绘制 mDivider.draw(c); }*/ //这种是在item头部画分割线 Rect rect = new Rect(); rect.left = parent.getPaddingLeft(); rect.right = parent.getWidth() - parent.getPaddingRight(); for(int i=1;i<childCount;i++){ View childView = parent.getChildAt(i); rect.bottom = childView.getTop(); rect.top = rect.bottom - mDivider.getIntrinsicHeight(); mDivider.setBounds(rect); mDivider.draw(c); } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { // 在每个子View的下面留出来画分割线 这种就是最后一条也会有分割线 可以采取在每条的上面添加分割先 第一条的时候 不添加 int childAdapterPosition = parent.getChildAdapterPosition(view); int childCount = parent.getChildCount(); /* 07-12 13:31:23.706 26939-26939/com.lcyj.cm.recyclecommonadatrer I/test: childAdapterPosition=0--childCount=1 07-12 13:31:23.728 26939-26939/com.lcyj.cm.recyclecommonadatrer I/test: childAdapterPosition=1--childCount=2 07-12 13:31:23.734 26939-26939/com.lcyj.cm.recyclecommonadatrer I/test: childAdapterPosition=2--childCount=3 07-12 13:31:23.744 26939-26939/com.lcyj.cm.recyclecommonadatrer I/test: childAdapterPosition=3--childCount=4 07-12 13:31:23.748 26939-26939/com.lcyj.cm.recyclecommonadatrer I/test: childAdapterPosition=4--childCount=5 07-12 13:31:23.751 26939-26939/com.lcyj.cm.recyclecommonadatrer I/test: childAdapterPosition=5--childCount=6 07-12 13:31:23.753 26939-26939/com.lcyj.cm.recyclecommonadatrer I/test: childAdapterPosition=6--childCount=7 07-12 13:31:23.756 26939-26939/com.lcyj.cm.recyclecommonadatrer I/test: childAdapterPosition=7--childCount=8 07-12 13:31:23.759 26939-26939/com.lcyj.cm.recyclecommonadatrer I/test: childAdapterPosition=8--childCount=9 07-12 13:31:23.762 26939-26939/com.lcyj.cm.recyclecommonadatrer I/test: childAdapterPosition=9--childCount=10*/ //这样我们没办法拿到最最后一条的数据 childCount在一直变化 我们可以拿到第一条 Log.i("test","childAdapterPosition="+childAdapterPosition+"--childCount="+childCount); //这种是所有底部有分割线 // outRect.bottom += mDivider.getIntrinsicHeight(); //这种是最后一条有分割线 if(childAdapterPosition != 0){ outRect.top = mDivider.getIntrinsicHeight(); } } }
2 :第二种 gridview样式 这种做了兼容listview的样式public class GridDivider extends RecyclerView.ItemDecoration{ private Drawable mDivider; public GridDivider(Context context, int res) { // 利用Drawable绘制分割线 mDivider = ContextCompat.getDrawable(context,res); } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { int childCount = parent.getChildCount(); drawHorizontal(c,parent); drawVeritial(c,parent); } /* 绘制垂直方向 * */ private void drawVeritial(Canvas c, RecyclerView parent) { int childCount = parent.getChildCount(); for (int i=0;i<childCount;i++){ View childView = parent.getChildAt(i); //这个方法是拿到item布局里面的Margin 有的布局会设置这个 有的没有 RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) childView.getLayoutParams(); int top = childView.getTop() - params.topMargin; int bottom = childView.getBottom() + params.bottomMargin; int left = childView.getRight() + params.leftMargin; int right = left +mDivider.getIntrinsicWidth(); mDivider.setBounds(left,top,right,bottom); mDivider.draw(c); } } /* 绘制水平方向 * */ private void drawHorizontal(Canvas c, RecyclerView parent) { int childCount = parent.getChildCount(); for (int i=0;i<childCount;i++){ View childView = parent.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) childView.getLayoutParams(); int left = childView.getLeft() - params.leftMargin; int right = childView.getRight() + mDivider.getIntrinsicWidth() +params.rightMargin; int top = childView.getBottom() + params.bottomMargin; int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left,top,right,bottom); mDivider.draw(c); } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { //这样的最右边 和最下边都有分割线 // outRect.bottom = mDivider.getIntrinsicHeight(); // outRect.right = mDivider.getIntrinsicWidth(); //不要最右边 和最左边的分割线 int bottom = mDivider.getIntrinsicHeight(); int right = mDivider.getIntrinsicWidth(); if (isLastCloumu(view,parent)) {//最后一列 right = 0; } //加上这个 else 的话 gridview最后一行为三行 的话 最后一行的最后一个下面的分割先还在 要去掉else if(isLastRow(view,parent)){//最后一行 bottom = 0; } outRect.bottom = bottom; outRect.right = right; } //最后一列 public boolean isLastCloumu(View view,RecyclerView parent) { //获取当前的位置 int currentPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition(); int spanCount = getSpanCount(parent); return (currentPosition + 1) % spanCount == 0; } //获取recycleview的列数 private int getSpanCount(RecyclerView parent) { //获取列数 RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); //这里要做判断 是不是gridview 还是 if(layoutManager instanceof GridLayoutManager){ GridLayoutManager gridLayoutManager = (GridLayoutManager)layoutManager ; //获取到列数 int spanCount = gridLayoutManager.getSpanCount(); return spanCount; } return 1; } //最后一行 public boolean isLastRow(View view,RecyclerView parent) { //获取当前的位置 当前位置 > (行数 -1)* 列数 int currentPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition(); //列数 int spanCount = getSpanCount(parent); // 行数 = 总的条目 / 列数 9/3=3 9/2=4 在这里必须% int rowNumber = parent.getAdapter().getItemCount()%spanCount == 0 ? parent.getAdapter().getItemCount()/spanCount : parent.getAdapter().getItemCount()/spanCount +1; return currentPosition +1 > (rowNumber - 1) * spanCount; } /* @Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { super.getItemOffsets(outRect, itemPosition, parent); }*/ }