在使用ListView 的时候可以通过java 代码或者在xml 中设置分割线,但是到了RecyclerView 发现并没有可以直接设置分割线的方法了。xml 中也没有设置的属性,查看源码,我们可以通过recyclerview.addItemDecoration() 添加自定义的分割线,该方法的参数是ItemDecoration抽象类,google并没有提供现成的实现类,所以我们要自己写一个类实现分割线方法。
下面看一个实现类
public class RecyclerViewItemDecoration extends RecyclerView.ItemDecoration {
private Context context;
private Drawable divider;
private int orientation;
private static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
private static final int VERTICAL_LIST= LinearLayoutManager.VERTICAL;
public RecyclerViewItemDecoration(Context context , int orientation,int drawableId){
this.orientation=orientation;
this.context=context;
divider=context.getResources().getDrawable(drawableId);
setOrientation(orientation);
}
private void setOrientation(int orientation){
if (orientation!=HORIZONTAL_LIST&&orientation!=VERTICAL_LIST){
throw new IllegalArgumentException("没有初始化 列表方向");
}
}
/**
* 画竖线
* @param c
* @param parent
* @param state
*/
private 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);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final int left = child.getRight()+ params.leftMargin;
final int right =left + divider.getIntrinsicHeight();
divider.setBounds(left, top, right, bottom);
divider.draw(c);
}
}
/**
* 画竖线
* @param c
* @param parent
* @param state
*/
private void drawHorizontalLine(Canvas c, RecyclerView parent, RecyclerView.State state) {
int left= parent.getPaddingLeft();
int right =parent.getWidth()-parent.getPaddingRight();
for (int i=0;i<parent.getChildCount();i++){
final View child =parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final int top =child.getBottom() +params.bottomMargin;
final int bottom =top+divider.getIntrinsicHeight();
divider.setBounds(left,top,right,bottom);
divider.draw(c);
}
}
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
if (orientation==HORIZONTAL_LIST){
drawVerticalLine(c,parent,state);
}else {
drawHorizontalLine(c,parent,state);
}
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
if (orientation ==HORIZONTAL_LIST){
outRect.set(0,0,0,divider.getIntrinsicHeight());
}else {
outRect.set(0,0,divider.getIntrinsicWidth(),0);
}
}
}
本文介绍如何为 RecyclerView 添加自定义分割线,通过创建 RecyclerViewItemDecoration 类实现 ItemDecoration 抽象类,并提供了绘制水平和垂直分割线的具体实现。
1794

被折叠的 条评论
为什么被折叠?



