(Android View)Recyclerview分割线

RecyclerView的简单使用   可以先回顾一下RecyclerView的使用方式

我们在使用RecyclerView的时候发现,这玩意根本没有分割线,看起来有点丑,查了一下资料,谷歌并没有提供默认的分割线,下面我们就把分割线搞出来,方便以后复制粘贴。

我们可以使用recyclerView的addItemDecoration()来加入分割线,因为谷歌默认没有提供,我们就需要继承RecyclerView.ItemDecoration来自定义分割线。

先贴上已经写好的代码,再进行分析。
/**
 * 作 者:黑马小杰
 * 时 间:2018/3/18
 * 邮 箱:[email protected]
 */

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

    public static final int HORIZONTAL = LinearLayoutManager.HORIZONTAL;
    public static final int VERTICAL = LinearLayoutManager.VERTICAL;
    private Drawable mDivider;
    private int mOrientation;
    private static final int[] ATTRS = new int[]{android.R.attr.listDivider};

    public DividerItemDecoration(Context context, int orientation) {
        final TypedArray a = context.obtainStyledAttributes(ATTRS);
        mDivider = a.getDrawable(0);
        a.recycle();
        setOrientation(orientation);
    }

    public void setOrientation(int orientation) {
        if (orientation != HORIZONTAL && orientation != VERTICAL) {

        }
        mOrientation = orientation;
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        if (mOrientation == VERTICAL) {
            drawVertical(c, parent);
        } else {
            drawHorizontal(c, parent);
        }
    }


    /**
     * 竖直排列,画水平分割线
     *
     * @param c
     * @param parent
     */
    public void drawVertical(Canvas c, RecyclerView parent) {
        /*  当orientation为 Vertical 时,Item的分割线水平线条
            分割线的 Top 和 Bottom 则需要计算出有多少个Item
            首先由Item的位置获取到child的位置坐标*/

        //左边=item左边距
        final int left = parent.getPaddingLeft();
        //右边的坐标=右边 + 分割线的width
        final int right = parent.getWidth() - parent.getPaddingRight();
        final int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = parent.getChildAt(i);
            android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext());
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            //Top = child的下边坐标 + child外边距距离
            final int top = child.getBottom() + params.bottomMargin;
            // 然后根据bottom = top +分割线高度
            final int bottom = top + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    /**
     * 水平排列,画竖直分割线
     *
     * @param c
     * @param parent
     */
    public void drawHorizontal(Canvas c, RecyclerView parent) {
            /*当orientation为 Horizontal 时,Item的分割线为竖直线
            分割线的Top和Bottom就容易确定
            分割线的 left 和 right 则需要计算出有多少个Item
            根据Item的位置获取到child的位置坐标*/

        final int top = parent.getPaddingTop();
        final int bottom = parent.getHeight() - parent.getPaddingBottom();

        final int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = parent.getChildAt(i);
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            //所以分割线的left = child的右边的坐标 + child的外边距的距离
            final int left = child.getRight() + params.rightMargin;
            //然后根据左边 + 分割线的宽度 得到右边的坐标
            final int right = left + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }


    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
    /* outRect.set(left, top, right, bottom);
       Item的四周间距
       垂直时,Item的下方预留出分割线的高度
       水平时,Item的右方预留出分割线的宽度*/
        if (mOrientation == VERTICAL) {
            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
        } else {
            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
        }
    }
}

首先注意的是onDraw方法。根据构造函数来确定分割线的方向。drawHorizontal和drawVertical分别绘制横向item(竖线)和竖直item(横线).getItemOffsets()设置分割线的尺寸。

调用方式更为简单,通过addItemDecoration方法加入divide的实例就OK了。但是今天踩了个坑,一定要注意。加载分割线一定要在setAdapter之前。谨记!

      DividerItemDecoration dividerItemDecoration=new DividerItemDecoration(getInstance().getActivity(), DividerItemDecoration.VERTICAL);
        recycler_sensor_list.addItemDecoration( dividerItemDecoration);


猜你喜欢

转载自blog.csdn.net/ma598214297/article/details/79599654