recyclerView添加自定义分割线

来源:互联网 发布:windows创建git服务器 编辑:程序博客网 时间:2024/06/05 11:13

recyclerview可以通过addItemDecoration()方法实现添加自定义分割线的功能。比如需要实现如下图功能

首先自己定义类继承自RecyclerView.ItemDecoration

public class MyDividerDecoration extends RecyclerView.ItemDecoration {    private static final int[] ATTRS = new int[]{            android.R.attr.listDivider    };    /**     * 用于绘制间隔样式     */    private Drawable mDivider;    public MyDividerDecoration(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) {        // 绘制间隔,每一个item,绘制右边和下方间隔样式        int childCount = parent.getChildCount();        int spanCount = ((GridLayoutManager)parent.getLayoutManager()).getSpanCount();        int orientation = ((GridLayoutManager)parent.getLayoutManager()).getOrientation();        boolean isDrawHorizontalDivider = true;        boolean isDrawVerticalDivider = true;        int extra = childCount % spanCount;        extra = extra == 0 ? spanCount : extra;        for(int i = 0; i < childCount; i++) {            isDrawVerticalDivider = true;            isDrawHorizontalDivider = true;            // 如果是竖直方向,最右边一列不绘制竖直方向的间隔            if(orientation == OrientationHelper.VERTICAL && (i + 1) % spanCount == 0) {                isDrawVerticalDivider = false;            }            // 如果是竖直方向,最后一行不绘制水平方向间隔            if(orientation == OrientationHelper.VERTICAL && i >= childCount - extra) {                isDrawHorizontalDivider = false;            }            // 如果是水平方向,最下面一行不绘制水平方向的间隔            if(orientation == OrientationHelper.HORIZONTAL && (i + 1) % spanCount == 0) {                isDrawHorizontalDivider = false;            }            // 如果是水平方向,最后一列不绘制竖直方向间隔            if(orientation == OrientationHelper.HORIZONTAL && i >= childCount - extra) {                isDrawVerticalDivider = false;            }            if(isDrawHorizontalDivider) {                drawHorizontalDivider(c, parent, i);            }            if(isDrawVerticalDivider) {                drawVerticalDivider(c, parent, i);            }        }    }    @Override    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {        int spanCount = ((GridLayoutManager) parent.getLayoutManager()).getSpanCount();        int orientation = ((GridLayoutManager)parent.getLayoutManager()).getOrientation();        int position = parent.getChildLayoutPosition(view);        if(orientation == OrientationHelper.VERTICAL && (position + 1) % spanCount == 0) {            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());            return;        }        if(orientation == OrientationHelper.HORIZONTAL && (position + 1) % spanCount == 0) {            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);            return;        }        outRect.set(0, 0, mDivider.getIntrinsicWidth(), mDivider.getIntrinsicHeight());    }    /**     * 绘制竖直间隔线     *     * @param canvas     * @param parent     *              父布局,RecyclerView     * @param position     *              irem在父布局中所在的位置     */    private void drawVerticalDivider(Canvas canvas, RecyclerView parent, int position) {        final View child = parent.getChildAt(position);        final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child                .getLayoutParams();        final int top = child.getTop() - params.topMargin;        final int bottom = child.getBottom() + params.bottomMargin + mDivider.getIntrinsicHeight();        final int left = child.getRight() + params.rightMargin;        final int right = left + mDivider.getIntrinsicWidth();        mDivider.setBounds(left, top, right, bottom);        mDivider.draw(canvas);    }    /**     * 绘制水平间隔线     *     * @param canvas     * @param parent     *              父布局,RecyclerView     * @param position     *              item在父布局中所在的位置     */    private void drawHorizontalDivider(Canvas canvas, RecyclerView parent, int position) {        final View child = parent.getChildAt(position);        final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child                .getLayoutParams();        final int top = child.getBottom() + params.bottomMargin;        final int bottom = top + mDivider.getIntrinsicHeight();        final int left = child.getLeft() - params.leftMargin;        final int right = child.getRight() + params.rightMargin + mDivider.getIntrinsicWidth();        mDivider.setBounds(left, top, right, bottom);        mDivider.draw(canvas);    }}
其次在drawable文件夹下新建xml文件定义间隔线宽度与颜色

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"    android:shape="rectangle" >    <solid android:color="@color/bg_gray"/>    <size android:height="2dp" android:width="2dp"/></shape>
然后在styles.xml中定义的应用主题里替换掉listdivider属性。

  <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">        <!-- Customize your theme here. -->        <item name="colorPrimary">@color/colorPrimary</item>        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>        <item name="colorAccent">@color/colorAccent</item>        <item name="android:listDivider">@drawable/my_divider</item>    </style>
接下来就是调用了

 recyclerview.addItemDecoration(new MyDividerDecoration(this));

到这里添加分割线的功能就实现了

原创粉丝点击