RecyclerView的divider

LinearLayoutManager情况

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

private static final int[] ATTRS = new int[] { android.R.attr.listDivider };

public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;

public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;

private Drawable mDivider;

private int mOrientation;

public DividerItemDecoration(Context context, int orientation) {

final TypedArray a = context.obtainStyledAttributes(ATTRS);

mDivider = a.getDrawable(0);

a.recycle();

setOrientation(orientation);

}

/**

*只需要传入一个drawable的id和方向,就可以作为divider

* @param context

* @param orientation 方向

* @param drawableId 分割线的drawableId

*/

public DividerItemDecoration(Context context, int orientation,int drawableId){

mDivider = context.getResources().getDrawable(drawableId);

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) {

Log.v("recyclerview - itemdecoration", "onDraw()");

if (mOrientation == VERTICAL_LIST) {

drawVertical(c, parent);

} else {

drawHorizontal(c, parent);

}

}

public void drawVertical(Canvas c, RecyclerView parent) {

final int left = parent.getPaddingLeft();

final int right = parent.getWidth() - parent.getPaddingRight();

final int childCount = parent.getChildCount();

for (int i = 0; i < childCount; i++) {

final View child = parent.getChildAt(i);

android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(

parent.getContext());

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);

}

}

public void drawHorizontal(Canvas c, RecyclerView parent) {

final int top = parent.getPaddingTop();

final int bottom = parent.getHeight() - parent.getPaddingBottom();

final int childCount = parent.getChildCount();

for (int i = 0; i < childCount; i++) {

final View child = parent.getChildAt(i);

final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child

.getLayoutParams();

final int left = child.getRight() + params.rightMargin;

final int right = left + mDivider.getIntrinsicHeight();

mDivider.setBounds(left, top, right, bottom);

mDivider.draw(c);

}

}

@Override

public void getItemOffsets(Rect outRect, int itemPosition,

RecyclerView parent) {

if (mOrientation == VERTICAL_LIST) {

outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());

} else {

outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);

}

}

}

GridLayoutManager清况

public class DividerGridItemDecoration extends RecyclerView.ItemDecoration {

//    private final int[] ATTRS = new int[] { android.R.attr.listDivider };

private Drawable mDivider;

//    private Paint paint;

// private int mDividerSize = 100;

public DividerGridItemDecoration(Context context,int drawableId)     {

//        final TypedArray a = context.obtainStyledAttributes(ATTRS);

//        mDivider = a.getDrawable(0);

//        a.recycle();

mDivider = context.getResources().getDrawable(drawableId);

//        paint = new Paint(Paint.ANTI_ALIAS_FLAG);

//        paint.setColor(Color.WHITE);

}

@Override

public void onDraw(Canvas c, RecyclerView parent, State state)     {

drawHorizontal(c, parent);

drawVertical(c, parent);

}

private int getSpanCount(RecyclerView parent)     {

// 列数

int spanCount = -1;

LayoutManager layoutManager = parent.getLayoutManager();

if (layoutManager instanceof GridLayoutManager)         {

spanCount = ((GridLayoutManager) layoutManager).getSpanCount();

} else if (layoutManager instanceof StaggeredGridLayoutManager)         {

spanCount = ((StaggeredGridLayoutManager) layoutManager)

.getSpanCount();

}

return spanCount;

}

public void drawHorizontal(Canvas c, RecyclerView parent)     {

int childCount = parent.getChildCount();

for (int i = 0; i < childCount; i++)         {

final View child = parent.getChildAt(i);

final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child

.getLayoutParams();

final int left = child.getLeft() - params.leftMargin;

final int right = child.getRight() + params.rightMargin

+ mDivider.getIntrinsicWidth();

final int top = child.getBottom() + params.bottomMargin;

final int bottom = top + mDivider.getIntrinsicHeight();

mDivider.setBounds(left, top, right, bottom);

mDivider.draw(c);

}

}

public void drawVertical(Canvas c, RecyclerView parent)     {

final int childCount = parent.getChildCount();

for (int i = 0; i < childCount; i++)         {

final View child = parent.getChildAt(i);

final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child

.getLayoutParams();

final int top = child.getTop() - params.topMargin;

final int bottom = child.getBottom() + params.bottomMargin;

final int left = child.getRight() + params.rightMargin;

final int right = left + mDivider.getIntrinsicWidth();

mDivider.setBounds(left, top, right, bottom);

mDivider.draw(c);

}

}

private boolean isLastColum(RecyclerView parent, int pos, int spanCount,

int childCount)     {

LayoutManager layoutManager = parent.getLayoutManager();

if (layoutManager instanceof GridLayoutManager)         {

if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边

{

return true;

}

} else if (layoutManager instanceof StaggeredGridLayoutManager)

{

int orientation = ((StaggeredGridLayoutManager) layoutManager)

.getOrientation();

if (orientation == StaggeredGridLayoutManager.VERTICAL)

{

if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边

{

return true;

}

} else

{

childCount = childCount - childCount % spanCount;

if (pos >= childCount)// 如果是最后一列,则不需要绘制右边

return true;

}

}

return false;

}

private boolean isLastRaw(RecyclerView parent, int pos, int spanCount,

int childCount)

{

LayoutManager layoutManager = parent.getLayoutManager();

if (layoutManager instanceof GridLayoutManager)

{

childCount = childCount - childCount % spanCount;

if (pos >= childCount)// 如果是最后一行,则不需要绘制底部

return true;

} else if (layoutManager instanceof StaggeredGridLayoutManager)

{

int orientation = ((StaggeredGridLayoutManager) layoutManager)

.getOrientation();

// StaggeredGridLayoutManager 且纵向滚动

if (orientation == StaggeredGridLayoutManager.VERTICAL)

{

childCount = childCount - childCount % spanCount;

// 如果是最后一行,则不需要绘制底部

if (pos >= childCount)

return true;

} else

// StaggeredGridLayoutManager 且横向滚动

{

// 如果是最后一行,则不需要绘制底部

if ((pos + 1) % spanCount == 0)

{

return true;

}

}

}

return false;

}

@Override

public void getItemOffsets(Rect outRect, int itemPosition,

RecyclerView parent)

{

int spanCount = getSpanCount(parent);

int childCount = parent.getAdapter().getItemCount();

if (isLastRaw(parent, itemPosition, spanCount, childCount))// 如果是最后一行,则不需要绘制底部

{

outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);

} else if (isLastColum(parent, itemPosition, spanCount, childCount))// 如果是最后一列,则不需要绘制右边

{

outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());

} else

{

outRect.set(0, 0, mDivider.getIntrinsicWidth(),

mDivider.getIntrinsicHeight());

}

}

}

你可能感兴趣的:(RecyclerView的divider)