查了下资料,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());        }    }}

更多相关文章

  1. [Android] 开发资料收集:性能优化
  2. Android刮奖控件,需要的直接拿去用
  3. Android(安卓)Studio中使用simpleUML绘制类图详细使用及说明
  4. Android(安卓)中显示 Gif 格式图
  5. android paint类
  6. Android的手势的保存
  7. Android(安卓)P在绘制界面时,默认更换skiagl绘图库绘制界面
  8. android canvas 绘制bitmap并保存到本地
  9. android自定义View-垂直滚动的TextView

随机推荐

  1. Android全屏--两种activity的实现方式
  2. 整理一下Android中的ListView
  3. Android面试资料集锦
  4. android 如何让dialog不消失,即使是用户
  5. Android(安卓)如何让EditText不自动获取
  6. 清理android桌面
  7. android异步任务
  8. Android(安卓)2.0 SDK
  9. android中activity.this跟getApplication
  10. android:configChanges="orientation|key