在使用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); } } }