在绘制RecyclerView的分割线时我们通常是设置系统属性的android:listDivider为自定义的样式,然后再通过TypedArray获取一个drawable对象,通过回执drawable对象来绘制分割线。例如:
package com.example.admin.bannerstudy.custom;
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.view.View;
import android.widget.LinearLayout;
/**
* 适用于RecyclerView.setLayoutManager(new GridLayoutManager());
*
* 主要是测试怎么画分割线,没有考虑最后一行和最后一列不要画线的情况
*
*/
public class GridItemDecorationExample extends RecyclerView.ItemDecoration {
public static final int[] ATTRS = new int[] {android.R.attr.listDivider};
public static final int HORIZONTAL_LIST = LinearLayout.HORIZONTAL;
public static final int VERICAL_LIST = LinearLayout.VERTICAL;
private Drawable mDivider;
private int mOrientation = VERICAL_LIST;
public GridItemDecorationExample(Context context) {
final TypedArray a = context.obtainStyledAttributes(ATTRS);
mDivider = a.getDrawable(0);
a.recycle();
}
public GridItemDecorationExample(Context context, int orientation) {
this(context);
setOrientation(orientation);
}
public void setOrientation(int orientation) {
if(orientation != HORIZONTAL_LIST && orientation != VERICAL_LIST) {
throw new IllegalArgumentException("invalid orientation");
}
mOrientation = orientation;
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
drawVertical(c, parent);
drawHorizental(c, parent);
}
private int getSpanCount (RecyclerView parent) {
int spanCount = -1;
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if(layoutManager instanceof GridLayoutManager) {
spanCount = ((GridLayoutManager) layoutManager).getSpanCount();
}
return spanCount;
}
// 绘制水平线,drawVertical表示每条线是垂直分布的
public void drawVertical(Canvas c, RecyclerView parent) {
final int left = parent.getPaddingLeft();
final int right = parent.getWidth() - parent.getPaddingRight();
final int childCount = parent.getChildCount();
if(mOrientation == VERICAL_LIST) { // 当设置列表垂直排布时
// 获取列表的总行数
int rows = (int)Math.ceil(((double)childCount / (double)getSpanCount(parent)));
for(int i = 0; i < rows; i++) {
// 取到每行的第一个childView
View childView = parent.getChildAt(i * getSpanCount(parent));
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) childView.getLayoutParams();
int top = childView.getBottom() + params.bottomMargin;
int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
} else if(mOrientation == HORIZONTAL_LIST) { // 但设置列表水平排布时
// 获取列表的总行数
int rows = getSpanCount(parent) >= childCount ? childCount : getSpanCount(parent);
for(int i = 0; i < rows; i++) {
// 取到每行的第一个childView
View childView = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) childView.getLayoutParams();