RecylerView通用分隔线实现

来源:互联网 发布:网络歌曲被下架 编辑:程序博客网 时间:2024/05/01 21:03

前面使用了recyclerview的分隔线的最简实现法。

但是对于一些比较特殊的需求,可能是办不到的,比如设置一张图片最为分隔线,自定义drawable文件,作为分隔线等等。

 

前面最简实现法不过是重写getItemOffsets方法,这里我们需要实现通用的分隔线,那么还需要复写一个方法,就是onDraw方法,这才是真正画出分隔线的方法。

废话不多说,直接上代码:

 

@Override
public void onDraw(Canvas c,RecyclerView parent, RecyclerView.State state) {
    super.onDraw(c, parent, state);
    //开始 画线
    //
可以在这里判断 是画水平的线 还是 画垂直的线
   
switch (mOrientation) {
        caseVertical:
            drawVerticalLine(c, parent);
            break;
        caseHorizontal:
            drawHorizontalLine(c,parent);
            break;
    }
}

 

这里有水平布局,和垂直布局的区别,当然分隔线的画法也是不同的咯。

 

 

垂直画法:

private void drawVerticalLine(Canvas c, RecyclerView parent) {    int childCount = parent.getChildCount();    for (int i = 0; i < childCount; i++) {        View childView = parent.getChildAt(i);        int left = childView.getLeft() - childView.getPaddingLeft();        int right = childView.getRight() - childView.getPaddingRight();        int top = childView.getBottom() + childView.getPaddingBottom();        int bottom = top + mDividerSize;        mDivier.setBounds(left, top, right, bottom);        mDivier.draw(c);    }}
 
简单的说,不过就是把设置进来的Dawable对象,设置大小,画到画布上而已。
 
水平画法:
private void drawHorizontalLine(Canvas c, RecyclerView parent) {    int childCount = parent.getChildCount();    for (int i = 0; i < childCount; i++) {        View childView = parent.getChildAt(i);        int left = childView.getLeft() + childView.getPaddingLeft();        int right = left + mDividerSize;        int top = childView.getTop() - childView.getPaddingTop();        int bottom = childView.getBottom() - childView.getPaddingBottom();        mDivier.setBounds(left, right, top, bottom);        mDivier.draw(c);    }}
 
 
mDrivider由外部注入,默认是android:listDivider。

 

 

@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {    switch (mOrientation) {        case Vertical:            outRect.set(0, 0, 0, mDividerSize);            break;        case Horizontal:            outRect.set(0, 0, mDividerSize, 0);            break;    }}

 

这里的mDividerSize 由外部注入,默认为1。

 

这样子,相对于前面的最简写法的更通用了。


package recyclerview;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.support.v7.widget.RecyclerView;import android.view.View;import android.widget.ListView;/** * Created by javalong on 2015/12/20 0020. */public class MyItemDecoration extends RecyclerView.ItemDecoration {    enum Orientation {        Vertical,        Horizontal    }    private Context mContext;    private Orientation mOrientation;    private Drawable mDivier;    private int mDividerSize = 1;    public MyItemDecoration(Context context, Orientation orientation) {        mContext = context;        mOrientation = orientation;        setDefaultDivier();    }    //默认的 divider 就用在 listDivier里面设置的    private void setDefaultDivier() {        TypedArray typedArray = mContext.obtainStyledAttributes(new int[]{android.R.attr.listDivider});        int resId = typedArray.getResourceId(0, android.R.attr.listDivider);        if (resId != 0) {            mDivier = typedArray.getResources().getDrawable(resId);        } else {            mDivier = typedArray.getDrawable(android.R.attr.listDivider);        }        typedArray.recycle();    }    //向外提供接口,可以直接注入    public void setDivier(Drawable divier) {        this.mDivier = divier;    }    public void setDividerSize(int dividerSize) {        this.mDividerSize = dividerSize;    }    @Override    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {        super.onDraw(c, parent, state);        //开始 画线        //可以在这里判断 是画水平的线 还是 画垂直的线        switch (mOrientation) {            case Vertical:                drawVerticalLine(c, parent);                break;            case Horizontal:                drawHorizontalLine(c, parent);                break;        }    }    private void drawHorizontalLine(Canvas c, RecyclerView parent) {        int childCount = parent.getChildCount();        for (int i = 0; i < childCount; i++) {            View childView = parent.getChildAt(i);            int left = childView.getLeft() + childView.getPaddingLeft();            int right = left + mDividerSize;            int top = childView.getTop() - childView.getPaddingTop();            int bottom = childView.getBottom() - childView.getPaddingBottom();            mDivier.setBounds(left, right, top, bottom);            mDivier.draw(c);        }    }    private void drawVerticalLine(Canvas c, RecyclerView parent) {        int childCount = parent.getChildCount();        for (int i = 0; i < childCount; i++) {            View childView = parent.getChildAt(i);            int left = childView.getLeft() - childView.getPaddingLeft();            int right = childView.getRight() - childView.getPaddingRight();            int top = childView.getBottom() + childView.getPaddingBottom();            int bottom = top + mDividerSize;            mDivier.setBounds(left, top, right, bottom);            mDivier.draw(c);        }    }    @Override    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {        switch (mOrientation) {            case Vertical:                outRect.set(0, 0, 0, mDividerSize);                break;            case Horizontal:                outRect.set(0, 0, mDividerSize, 0);                break;        }    }}


0 0
原创粉丝点击