android 分割线 整洁,Android-RecyclerView分割线(水平/垂直/网格)

// 设置水平分割线

rv.setLayoutManager(new LinearLayoutManager(cxt));

rv.addItemDecoration(new GridItemDecoration(1, 0, cxt.getResources().getColor(R.color.gray_dim), true));

// 设置3列网格分割线

recyclerView.setLayoutManager(new GridLayoutManager(context, 3));

recyclerView.addItemDecoration(new GridItemDecoration(1, 1, mAct.getResources().getColor(R.color.gray_dim), true));

public class GridItemDecoration extends RecyclerView.ItemDecoration

{

private int mHorizonLineWidth;

private int mVerticalLineWidth;

private Drawable mDividerDrawable;

private boolean isDrawLastLine;

/**

* 构造分割线

*

* @param horizonLineWidth 水平分割线宽

* @param verticalLineWidth 垂直分割线宽

* @param dividerColor 分割线颜色

* @param isDrawLastLine 是否绘制最后一行分割线

*/

public GridItemDecoration(int horizonLineWidth, int verticalLineWidth, int dividerColor, boolean isDrawLastLine)

{

this.mHorizonLineWidth = horizonLineWidth;

this.mVerticalLineWidth = verticalLineWidth;

this.isDrawLastLine = isDrawLastLine;

this.mDividerDrawable = new ColorDrawable(dividerColor);

}

@Override

public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state)

{

// drawHorizontal

int childCount = parent.getChildCount();

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

{

View child = parent.getChildAt(i);

if (!isDrawLastLine && isLastRaw(parent, i, getSpanCount(parent), childCount))

continue;

RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

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

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

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

final int bottom = top + mHorizonLineWidth;

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

mDividerDrawable.draw(c);

}

// drawVertical

int childCount1 = parent.getChildCount();

for (int i = 0; i < childCount1; i++)

{

final View child = parent.getChildAt(i);

if ((parent.getChildViewHolder(child).getAdapterPosition() + 1) % getSpanCount(parent) == 0)

continue;

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

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

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

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

int right = left + mVerticalLineWidth;

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

mDividerDrawable.draw(c);

}

}

@Override

public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state)

{

int spanCount = getSpanCount(parent);

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

int itemPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition();

if (itemPosition < 0)

return;

int column = itemPosition % spanCount;

int bottom;

int left = column * mVerticalLineWidth / spanCount;

int right = mVerticalLineWidth - (column + 1) * mVerticalLineWidth / spanCount;

if (isLastRaw(parent, itemPosition, spanCount, childCount))

bottom = isDrawLastLine ? mHorizonLineWidth : 0;

else

bottom = mHorizonLineWidth;

outRect.set(left, 0, right, bottom);

}

private int getSpanCount(RecyclerView parent)

{

int spanCount = -1;

RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();

if (layoutManager instanceof GridLayoutManager)

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

else if (layoutManager instanceof StaggeredGridLayoutManager)

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

return spanCount;

}

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

{

RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();

if (layoutManager instanceof GridLayoutManager)

{

int remainCount = childCount % spanCount;

if (remainCount == 0)

return pos >= childCount - spanCount;

else

return pos >= childCount - childCount % spanCount;

}

else if (layoutManager instanceof StaggeredGridLayoutManager)

{

int orientation = ((StaggeredGridLayoutManager) layoutManager).getOrientation();

if (orientation == StaggeredGridLayoutManager.VERTICAL)

{

// 水平滚动

int remainCount = childCount % spanCount;

if (remainCount == 0)

return pos >= childCount - spanCount;

else

return pos >= childCount - childCount % spanCount;

}

else // 垂直滚动

return (pos + 1) % spanCount == 0;

}

else if (layoutManager instanceof LinearLayoutManager)

{

return pos >= parent.getAdapter().getItemCount() - 1;

}

return false;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值