发布时间:2017-06-27责任编辑:朱明 浏览:2813
listView可以通过设置diver属性来定义分割线,但RecyclerView没有这样的属性,官方提供了addItemDecoration方法,我们可以通过继承RecyclerView.ItemDecoration来自定义分割线。
自定义分割线有三个方法:getItemOffsets、onDraw、onDrawOver,下面分别做介绍:
getItemOffsets方法用于设定分割线的属性,比如颜色和宽度。针对每一个itemView在左、上、右、下方向,通过outRect.set方法进行设置。
onDraw则是具体的画出分割线,需要注意的是,onDraw方法针对的是整个RecyclerView,因此需要遍历RecyclerView的每个itemView,通过Canvas的drawRect方法画出分割线。
onDrawOver方法也是画分割线,不同的是onDraw方法的分割线是在itemView的下方进行绘制,而onDrawOver是在itemView的上方进行绘制,一般用于在绘制完itemView后再画一些分割线。
一般的自定义分割线只需要重写getItemOffsets和onDraw就可以了,在实现两个方法后,通过RecyclerView的addItemDecoration方法,便可随意设置分割线的宽度、颜色等属性设置分割线。
部分代码:
/**
* 设置ItemView的分割线(左上右下) 针对每个ItemView
* @param outRect
* @param view
* @param parent
* @param state
*/
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect,view,parent,state);
outRect.set(0,0,0,diver);
}
/**
* 在ItemView以下绘制Decoration 针对整个RecyclerView 绘制需遍历所有ItemView(仅可见Item)
* @param canvas
* @param parent
* @param state
*/
@Override
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
super.onDraw(canvas,parent,state);
int count = parent.getChildCount();
// 遍历每个itemView
for (int i = 0; i < count; i++) {
if(i == count - 1){
break;
}
View view = parent.getChildAt(i);
RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) view.getLayoutParams();
// 开始绘制
int left = layoutParams.leftMargin;
int top = view.getBottom() +layoutParams.bottomMargin;
int right = parent.getWidth() - layoutParams.rightMargin;
int bottom = top + diver;
canvas.drawRect(left,top,right,bottom,paint);
}
}
敬业工作室 供稿