RecyclerView自定义分割线————列表分割线

来源:互联网 发布:手机版施工软件 编辑:程序博客网 时间:2024/06/05 04:10
//添加分割线MyDecoration decoration=new MyDecoration(MainActivity.this,MyDecoration.VERTICAL_LIST);rv.addItemDecoration(decoration);
package xixinxin.bawie.com.recyleclerview;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.GridLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.StaggeredGridLayoutManager;import android.view.View;public class MyDecoration extends RecyclerView.ItemDecoration {
    private Context mContext;    private Drawable mDivider;    private int mOrientation;    public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;    public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;    //我们通过获取系统属性中的listDivider来添加,在系统中的AppTheme中设置    public static final int[] ATRRS  = new int[]{            android.R.attr.listDivider    };    public MyDecoration(Context context, int orientation) {        this.mContext = context;        final TypedArray ta = context.obtainStyledAttributes(ATRRS);        this.mDivider = ta.getDrawable(0);        ta.recycle();        setOrientation(orientation);    }    //设置屏幕的方向    public void setOrientation(int orientation){        if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST){            throw new IllegalArgumentException("invalid orientation");        }        mOrientation = orientation;    }    @Override    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {        if (mOrientation == HORIZONTAL_LIST){            drawVerticalLine(c, parent, state);        }else {            drawHorizontalLine(c, parent, state);        }    }    //画横线, 这里的parent其实是显示在屏幕显示的这部分    public void drawHorizontalLine(Canvas c, RecyclerView parent, RecyclerView.State state){        int left = parent.getPaddingLeft();        int right = parent.getWidth() - parent.getPaddingRight();        final int childCount = parent.getChildCount();        for (int i = 0; i < childCount; i++){            final View child = parent.getChildAt(i);            //获得child的布局信息            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams)child.getLayoutParams();            final int top = child.getBottom() + params.bottomMargin;            final int bottom = top + mDivider.getIntrinsicHeight();            mDivider.setBounds(left, top, right, bottom);            mDivider.draw(c);            //Log.d("wnw", left + " " + top + " "+right+"   "+bottom+" "+i);        }    }    //画竖线    public void drawVerticalLine(Canvas c, RecyclerView parent, RecyclerView.State state){        int top = parent.getPaddingTop();        int bottom = parent.getHeight() - parent.getPaddingBottom();        final int childCount = parent.getChildCount();        for (int i = 0; i < childCount; i++){            final View child = parent.getChildAt(i);            //获得child的布局信息            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams)child.getLayoutParams();            final int left = child.getRight() + params.rightMargin;            final int right = left + mDivider.getIntrinsicWidth();            mDivider.setBounds(left, top, right, bottom);            mDivider.draw(c);        }    }    //由于Divider也有长宽高,每一个Item需要向下或者向右偏移    @Override    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {        if(mOrientation == HORIZONTAL_LIST){            //画横线,就是往下偏移一个分割线的高度            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());        }else {            //画竖线,就是往右偏移一个分割线的宽度            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);        }    }}

0 0
原创粉丝点击