recycleView分割线

   上一篇写到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);
    }*/
}



 之上是分割线总结,都是经过测试的,不足之处望大家一起完善。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值