android 竖线分割线,RecyclerView 添加分割线

RecyclerView 的条目之间没有分割线,需要我们自己去定义添加

第一步,自定义一个类继承于 RecyclerView.ItemDecoration

public class MyItemDecoration 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

};

/**

* 默认分割线

* @param context

* @param orientation

*/

public MyItemDecoration(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);

}

}

}

第二步,在代码中设置

//设置分割线

mFragmentRecyclerview.addItemDecoration(new MyItemDecoration(getActivity(),LinearLayoutManager.VERTICAL));

第三步,修改分割线的颜色和高度,需要在 AppTheme 中设置

@color/colorPrimary

@color/colorPrimaryDark

@color/colorAccent

@drawable/shape_line

shape_line.xml 是一个自定义的 shape ,可以设置 shape 来改变颜色和高度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值