package com.ckr.decoration; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.support.annotation.DrawableRes; import android.support.annotation.IntRange; import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.View; import static com.ckr.decoration.DecorationLog.Logd; import static com.ckr.decoration.DecorationLog.Loge; /** * Created by PC大佬 on 2018/1/6. */ public class DividerGridItemDecoration extends BaseItemDecoration { private static final String TAG = "GridItemDecoration"; protected int mSpanCount = 1; private Drawable mTopDivider; //item上方分割线的drawable private Drawable mBottomDivider; //item下方分割线的drawable private Drawable mLeftDivider; //item左边方分割线的drawable private Drawable mRightDivider; //item右方分割线的drawable private boolean isSticky;//固定头部 private int mStickyHeightOrWidth;//固定头部高度或宽度 private Drawable mStickyDrawable;//固定头部样式 private int mStickyTextPaddingLeft = 48;//固定头部的文本左边距 private int mStickyTextPaddingTop = 60;//固定头部的文本上边距 private int mStickyTextColor = Color.WHITE;//固定头部的文本的字体颜色 private int mStickyTextSize = 42;//固定头部的文本的字体大小 private Paint mStickyTextPaint; private float mOffsetY;//字体中间线到基准线baseline的偏移量 private float mTextHeight; public DividerGridItemDecoration(Context context, int mSpanCount) { super(context, GRID, VERTICAL); this.mSpanCount = mSpanCount; } public DividerGridItemDecoration(Context context, int orientation, int mSpanCount) { super(context, GRID, orientation); this.mSpanCount = mSpanCount; } public DividerGridItemDecoration(Context context, int orientation, int mSpanCount, @DrawableRes int drawableId) { super(context, GRID, orientation, drawableId); this.mSpanCount = mSpanCount; } private DividerGridItemDecoration(Builder builder) { super(builder); this.mSpanCount = builder.mSpanCount; this.isSticky = builder.isSticky; this.mStickyHeightOrWidth = builder.mStickyHeightOrWidth; this.mStickyDrawable = builder.mStickyDrawable; this.mStickyTextPaddingLeft = builder.mStickyTextPaddingLeft; this.mStickyTextPaddingTop = builder.mStickyTextPaddingTop; this.mStickyTextColor = builder.mStickyTextColor; this.mStickyTextSize = builder.mStickyTextSize; if (isSticky) { mStickyTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mStickyTextPaint.setColor(mStickyTextColor);//注意:颜色需为argb,否则,绘制不出 mStickyTextPaint.setTextSize(mStickyTextSize); if (mOrientation == HORIZONTAL) { mStickyTextPaint.setTextAlign(Paint.Align.CENTER); } Paint.FontMetricsInt mFontMetricsInt = mStickyTextPaint.getFontMetricsInt(); mTextHeight = (mFontMetricsInt.descent - mFontMetricsInt.ascent); float textCenter = mTextHeight / 2.0f; mOffsetY = -mFontMetricsInt.ascent - textCenter; } } public DividerGridItemDecoration setShowOtherStyle(boolean showOtherStyle) { isShowOtherStyle = showOtherStyle; return this; } public BaseItemDecoration setSticky(boolean sticky) { isSticky = sticky; return this; } public BaseItemDecoration setStickyHeightOrWidth(@IntRange(from = 0) int stickyHeaderHeight) { this.mStickyHeightOrWidth = stickyHeaderHeight; return this; } public BaseItemDecoration setStickyDrawable(@DrawableRes int drawableId) { this.mStickyDrawable = ContextCompat.getDrawable(mContext.getApplicationContext(), drawableId); ; if (this.mStickyHeightOrWidth == 0) { this.mStickyHeightOrWidth = mStickyDrawable.getIntrinsicHeight(); } return this; } public BaseItemDecoration setStickyTextPaddingLeft(int textPaddingLeft) { this.mStickyTextPaddingLeft = textPaddingLeft; return this; } public BaseItemDecoration setStickyTextPaddingTop(int textPaddingTop) { this.mStickyTextPaddingTop = textPaddingTop; return this; } /** * @param textColor 颜色需为argb,否则不生效 * @return */ public BaseItemDecoration setStickyTextColor(int textColor) { this.mStickyTextColor = textColor; return this; } public BaseItemDecoration setStickyTextSize(int textSize) { this.mStickyTextSize = textSize; return this; } //绘制水平分割线 @Override protected void drawHorizontal(Canvas c, RecyclerView parent) { int childCount = parent.getChildCount();//可视item的个数 int itemCount = parent.getAdapter().getItemCount();//item总个数 Logd(TAG, "drawHorizontal: childCount:" + childCount + ",itemCount:" + itemCount); int left = 0; int top = 0; int right = 0; int bottom = 0; boolean headerPosHandle = true; boolean footerPosHandle = true; boolean isSubDividerHandle = true; boolean isRedrawDividerHandle = true; for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); int topDividerHeight = mDividerHeight; int bottomDividerHeight = mDividerHeight; mTopDivider = mDivider; mBottomDivider = mDivider; if (mOrientation == VERTICAL) { int leftDividerWidth = mDividerWidth; int rightDividerWidth = mDividerWidth; if (noDrawLeftDivider) {//最左边分割线处理 if (i % mSpanCount == 0) { leftDividerWidth = 0; } } if (noDrawRightDivider) {//最右边分割线处理 if (i % mSpanCount == mSpanCount - 1) { rightDividerWidth = 0; } } left = child.getLeft() - params.leftMargin - leftDividerWidth;//计算分割线的左边 right = child.getRight() + params.rightMargin + rightDividerWidth;//计算分割线的右边 //<editor-fold desc="顶部分割线绘制与定制"> if (noDrawHeaderDivider) {//顶部分割线处理 if (headerPosHandle) { int adapterPosition = parent.getChildAdapterPosition(child); if (mSpanCount > adapterPosition) { Logd(TAG, "drawHorizontal: noDrawHeaderDivider:" + i + ",adapterPosition:" + adapterPosition); topDividerHeight = 0; if (adapterPosition == mSpanCount - 1) { headerPosHandle = false; } } else { headerPosHandle = false; } } } else { if (isRedrawHeaderDivider) {//顶部分割线的定制 if (headerPosHandle) { int adapterPosition = parent.getChildAdapterPosition(child); if (mSpanCount > adapterPosition) { Logd(TAG, "drawHorizontal: isRedrawHeaderDivider:" + i + ",adapterPosition:" + adapterPosition); topDividerHeight = mHeaderDividerHeight; if (adapterPosition == mSpanCount - 1) { headerPosHandle = false; } if (mHeaderDividerDrawable != null) { mTopDivider = mHeaderDividerDrawable; } } else { headerPosHandle = false; } } } } //</editor-fold> //<editor-fold desc="底部分割线绘制与定制"> if (noDrawFooterDivider) {//底部分割线处理 if (footerPosHandle) { int rowNum = itemCount % mSpanCount == 0 ? itemCount / mSpanCount - 1 : itemCount / mSpanCount; int startNum = childCount - (itemCount - rowNum * mSpanCount); if (startNum <= i) { int adapterPosition = parent.getChildAdapterPosition(child); if (rowNum * mSpanCount <= adapterPosition) { Logd(TAG, "drawHorizontal: noDrawFooterDivider:" + i + ",adapterPosition:" + adapterPosition); bottomDividerHeight = 0; if (adapterPosition == itemCount - 1) { footerPosHandle = false; } } else { footerPosHandle = false; } } } } else { if (isRedrawFooterDivider) {//底部分割线的定制 if (footerPosHandle) { int rowNum = itemCount % mSpanCount == 0 ? itemCount / mSpanCount - 1 : itemCount / mSpanCount; int startNum = childCount - (itemCount - rowNum * mSpanCount); if (startNum <= i) { int adapterPosition = parent.getChildAdapterPosition(child); if (rowNum * mSpanCount <= adapterPosition) { Logd(TAG, "drawHorizontal: isRedrawFooterDivider:" + i + ",adapterPosition:" + adapterPosition); bottomDividerHeight = mFooterDividerHeight; if (adapterPosition == itemCount - 1) { footerPosHandle = false; } if (mFooterDividerDrawable != null) { mBottomDivider = mFooterDividerDrawable; } } else { footerPosHandle = false; } } } } } //</editor-fold> //<editor-fold desc="分割线批量定制"> if (isSubDivider) {//分割线的截取 if (isSubDividerHandle) { int adapterPosition = parent.getChildAdapterPosition(child); int rowCount = itemCount % mSpanCount == 0 ? itemCount / mSpanCount : itemCount / mSpanCount + 1; int rowNum = (adapterPosition + 1) % mSpanCount == 0 ? (adapterPosition + 1) / mSpanCount - 1 : (adapterPosition + 1) / mSpanCount; if (rowNum > mStartIndex) { int maxRow = Math.min(mEndIndex, rowCount - 1); if (rowNum < maxRow) { bottomDividerHeight = mSubDividerHeight; topDividerHeight = mSubDividerHeight; if (mSubDrawable != null) { mTopDivider = mSubDrawable; mBottomDivider = mSubDrawable; } } else if (rowNum == maxRow) { topDividerHeight = mSubDividerHeight; if (mSubDrawable != null) { mTopDivider = mSubDrawable; } } else { isSubDividerHandle = false; } } else if (rowNum == mStartIndex) { bottomDividerHeight = mSubDividerHeight; if (mSubDrawable != null) { mBottomDivider = mSubDrawable; } } } } //</editor-fold> //<editor-fold desc="分割线定制"> if (isRedrawDivider) {//分割线的定制 if (isRedrawDividerHandle) { int adapterPosition = parent.getChildAdapterPosition(child); int rowNum = (adapterPosition + 1) % mSpanCount == 0 ? (adapterPosition + 1) / mSpanCount : (adapterPosition + 1) / mSpanCount + 1; if ((rowNum - 1) == mDividerIndex) { bottomDividerHeight = mRedrawDividerHeight; if (mDividerDrawable != null) { mBottomDivider = mDividerDrawable; } } else if (mDividerIndex + 1 == rowNum - 1) { topDividerHeight = mRedrawDividerHeight; if (mDividerDrawable != null) { mTopDivider = mDividerDrawable; } } } } //</editor-fold> //<editor-fold desc="---item的上方的分割线绘制---"> bottom = child.getTop() - params.topMargin;//计算分割线的下边 top = bottom - topDividerHeight;//计算分割线的上边 mTopDivider.setBounds(left, top, right, bottom); mTopDivider.draw(c); //</editor-fold> //<editor-fold desc="---item的下方的分割线绘制---"> top = child.getBottom() + params.bottomMargin;//计算分割线的上边 bottom = top + bottomDividerHeight;//计算分割线的下边 mBottomDivider.setBounds(left, top, right, bottom); mBottomDivider.draw(c); //</editor-fold> } else { left = child.getLeft() - params.leftMargin;//计算分割线的左边 right = child.getRight() + params.rightMargin;//计算分割线的右边 if (noDrawHeaderDivider) {//顶部分割线处理 if (i % mSpanCount == 0) { Loge(TAG, "drawHorizontal: noDrawHeaderDivider:" + i); topDividerHeight = 0; } } if (noDrawFooterDivider) {//底部分割线处理 if (i % mSpanCount == mSpanCount - 1) { Loge(TAG, "drawHorizontal: noDrawFooterDivider:" + i); bottomDividerHeight = 0; } } //<editor-fold desc="---item的上方的分割线绘制---"> bottom = child.getTop() - params.topMargin;//计算分割线的下边 top = bottom - topDividerHeight;//计算分割线的上边 mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); //</editor-fold> //<editor-fold desc="---item的下方的分割线绘制---"> top = child.getBottom() + params.bottomMargin;//计算分割线的上边 bottom = top + bottomDividerHeight;//计算分割线的下边 mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); //</editor-fold> } } } //绘制竖直分割线 @Override protected void drawVertical(Canvas c, RecyclerView parent) { final int childCount = parent.getChildCount();//可视item的个数 int itemCount = parent.getAdapter().getItemCount();//item个数 int left = 0; int top = 0; int right = 0; int bottom = 0; boolean leftPosHandle = true; boolean rightPosHandle = true; boolean isSubDividerHandle = true; boolean isRedrawDividerHandle = true; for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); int leftDividerWidth = mDividerWidth; int rightDividerWidth = mDividerWidth; mLeftDivider = mDivider; mRightDivider = mDivider; if (mOrientation == VERTICAL) { top = child.getTop() - params.topMargin; bottom = child.getBottom() + params.bottomMargin; if (noDrawLeftDivider) { if (i % mSpanCount == 0) { leftDividerWidth = 0; } } if (noDrawRightDivider) { if (i % mSpanCount == mSpanCount - 1) { rightDividerWidth = 0; } } //<editor-fold desc="---item的左边的分割线绘制---"> right = child.getLeft() - params.leftMargin; left = right - leftDividerWidth; mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); //</editor-fold> //<editor-fold desc="---item的右边的分割线绘制---"> left = child.getRight() + params.rightMargin; right = left + rightDividerWidth; mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); //</editor-fold> } else { int topDividerWidth = mDividerHeight; int bottomDividerWidth = mDividerHeight; if (noDrawHeaderDivider) {//头部分割线处理 if (i % mSpanCount == 0) { topDividerWidth = 0; } } if (noDrawFooterDivider) {//底部分割线处理 if (i % mSpanCount == mSpanCount - 1) { bottomDividerWidth = 0; } } top = child.getTop() - params.topMargin - topDividerWidth; bottom = child.getBottom() + params.bottomMargin + bottomDividerWidth; //<editor-fold desc="最左边分割线绘制与定制"> if (noDrawLeftDivider) {//左边分割线处理 if (leftPosHandle) { int adapterPosition = parent.getChildAdapterPosition(child); if (mSpanCount > adapterPosition) { Loge(TAG, "drawVertical: noDrawHeaderDivider:" + i + ",adapterPosition:" + adapterPosition); leftDividerWidth = 0; if (adapterPosition == mSpanCount - 1) { leftPosHandle = false; } } else { leftPosHandle = false; } } } else { if (isRedrawLeftDivider) {//左边分割线定制 if (leftPosHandle) { int adapterPosition = parent.getChildAdapterPosition(child); if (mSpanCount > adapterPosition) { leftDividerWidth = mLeftDividerWidth; if (adapterPosition == mSpanCount - 1) { leftPosHandle = false; } if (mLeftDividerDrawable != null) { mLeftDivider = mLeftDividerDrawable; } } else { leftPosHandle = false; } } } } //</editor-fold> //<editor-fold desc="最右边分割线绘制与定制"> if (noDrawRightDivider) {//右边分割线处理 if (rightPosHandle) { int columnNum = itemCount % mSpanCount == 0 ? itemCount / mSpanCount - 1 : itemCount / mSpanCount; int startNum = childCount - (itemCount - columnNum * mSpanCount); if (startNum <= i) { int adapterPosition = parent.getChildAdapterPosition(child); if (columnNum * mSpanCount <= adapterPosition) { Logd(TAG, "drawVertical: noDrawFooterDivider:" + i + ",adapterPosition:" + adapterPosition); rightDividerWidth = 0; if (adapterPosition == itemCount - 1) { rightPosHandle = false; } } else { rightPosHandle = false; } } } } else { if (isRedrawRightDivider) {//右边分割线定制 if (rightPosHandle) { int columnNum = itemCount % mSpanCount == 0 ? itemCount / mSpanCount - 1 : itemCount / mSpanCount; int startNum = childCount - (itemCount - columnNum * mSpanCount); if (startNum <= i) { int adapterPosition = parent.getChildAdapterPosition(child); if (columnNum * mSpanCount <= adapterPosition) { Logd(TAG, "drawVertical: noDrawFooterDivider:" + i + ",adapterPosition:" + adapterPosition); rightDividerWidth = mRightDividerWidth; if (adapterPosition == itemCount - 1) { rightPosHandle = false; } if (mRightDividerDrawable != null) { mRightDivider = mRightDividerDrawable; } } else { rightPosHandle = false; } } } } } //</editor-fold> //<editor-fold desc="分割线批量定制"> if (isSubDivider) {//分割线的截取 if (isSubDividerHandle) { int adapterPosition = parent.getChildAdapterPosition(child); int rowCount = itemCount % mSpanCount == 0 ? itemCount / mSpanCount : itemCount / mSpanCount + 1; int rowNum = (adapterPosition + 1) % mSpanCount == 0 ? (adapterPosition + 1) / mSpanCount - 1 : (adapterPosition + 1) / mSpanCount; if (rowNum > mStartIndex) { Loge(TAG, "drawVertical: mStartIndex:" + mStartIndex + ",mEndIndex:" + mEndIndex + ",adapterPosition:" + adapterPosition); int maxRow = Math.min(mEndIndex, rowCount - 1); if (rowNum < maxRow) { leftDividerWidth = mSubDividerWidth; rightDividerWidth = mSubDividerWidth; if (mSubDrawable != null) { mLeftDivider = mSubDrawable; mRightDivider = mSubDrawable; } } else if (rowNum == maxRow) { leftDividerWidth = mSubDividerWidth; if (mSubDrawable != null) { mLeftDivider = mSubDrawable; } } else { isSubDividerHandle = false; } } else if (rowNum == mStartIndex) { rightDividerWidth = mSubDividerWidth; if (mSubDrawable != null) { mRightDivider = mSubDrawable; } } } } //</editor-fold> //<editor-fold desc="分割线定制"> if (isRedrawDivider) {//分割线的定制 if (isRedrawDividerHandle) { int adapterPosition = parent.getChildAdapterPosition(child); int rowNum = (adapterPosition + 1) % mSpanCount == 0 ? (adapterPosition + 1) / mSpanCount : (adapterPosition + 1) / mSpanCount + 1; if ((rowNum - 1) == mDividerIndex) { rightDividerWidth = mRedrawDividerWidth; if (mDividerDrawable != null) { mRightDivider = mDividerDrawable; } } else if (mDividerIndex + 1 == rowNum - 1) { leftDividerWidth = mRedrawDividerWidth; if (mDividerDrawable != null) { mLeftDivider = mDividerDrawable; } } } } //</editor-fold> //<editor-fold desc="---item的左边的分割线绘制---"> right = child.getLeft() - params.leftMargin; left = right - leftDividerWidth; mLeftDivider.setBounds(left, top, right, bottom); mLeftDivider.draw(c); //</editor-fold> //<editor-fold desc="---item的右边的分割线绘制---"> left = child.getRight() + params.rightMargin; right = left + rightDividerWidth; mRightDivider.setBounds(left, top, right, bottom); mRightDivider.draw(c); //</editor-fold> } } } /** * 要想清楚outRect作用,请看{@link android.support.v7.widget.GridLayoutManager}源码,如:measureChild(). */ @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { int itemPosition = parent.getChildAdapterPosition(view); Loge(TAG, "getItemOffsets: pos:" + itemPosition); int left = mDividerWidth; int top = mDividerHeight; int right = mDividerWidth; int bottom = mDividerHeight; if (mOrientation == VERTICAL) { //<editor-folder desc="悬浮头部"> if (isSticky) {//悬浮头部 RecyclerView.Adapter adapter = parent.getAdapter(); if (adapter instanceof OnHeaderListener) { OnHeaderListener listener = ((OnHeaderListener) adapter); String headerName = listener.getHeaderName(itemPosition); if (!TextUtils.isEmpty(headerName)) { if (itemPosition == 0 || !headerName.equals(listener.getHeaderName(itemPosition - 1))) { Logd(TAG, "getItemOffsets: headerName:" + headerName + ",itemPosition:" + itemPosition); top = mStickyHeightOrWidth; outRect.set(0, top, 0, bottom); return; } } } } //</editor-folder> //<editor-fold desc="顶部分割线绘制与定制"> if (noDrawHeaderDivider) { if (mSpanCount > itemPosition) { Logd(TAG, "getItemOffsets: noDrawHeaderDivider:" + itemPosition); top = 0; } } else { if (isRedrawHeaderDivider) { if (mSpanCount > itemPosition) { Loge(TAG, "getItemOffsets: isRedrawHeaderDivider:" + itemPosition); top = mHeaderDividerHeight; } } } //</editor-fold> //<editor-fold desc="底部分割线绘制与定制"> if (noDrawFooterDivider) { int itemCount = parent.getAdapter().getItemCount(); int rowNum = itemCount % mSpanCount == 0 ? itemCount / mSpanCount - 1 : itemCount / mSpanCount; if (rowNum * mSpanCount <= itemPosition) { Logd(TAG, "getItemOffsets: noDrawFooterDivider:" + itemPosition); bottom = 0; } } else { if (isRedrawFooterDivider) { int itemCount = parent.getAdapter().getItemCount(); int rowNum = itemCount % mSpanCount == 0 ? itemCount / mSpanCount - 1 : itemCount / mSpanCount; if (rowNum * mSpanCount <= itemPosition) { bottom = mFooterDividerHeight; } } } //</editor-fold> if (noDrawLeftDivider) { if (itemPosition % mSpanCount == 0) { left = 0; } } if (noDrawRightDivider) { if (itemPosition % mSpanCount == mSpanCount - 1) { right = 0; } } //<editor-fold desc="分割线批量定制"> if (isSubDivider) { int itemCount = parent.getAdapter().getItemCount(); int rowCount = itemCount % mSpanCount == 0 ? itemCount / mSpanCount : itemCount / mSpanCount + 1; if (mStartIndex >= rowCount - 1) { isSubDivider = false; } else { int rowNum = (itemPosition + 1) % mSpanCount == 0 ? (itemPosition + 1) / mSpanCount - 1 : (itemPosition + 1) / mSpanCount;//计算第几行 if (rowNum > mStartIndex) { int maxRow = Math.min(mEndIndex, rowCount - 1); if (rowNum < maxRow) { top = mSubDividerHeight; bottom = mSubDividerHeight; } else if (rowNum == maxRow) { top = mSubDividerHeight; } } else if (rowNum == mStartIndex) { bottom = mSubDividerHeight; } } } //</editor-fold> //<editor-fold desc="分割线定制"> if (isRedrawDivider) { int itemCount = parent.getAdapter().getItemCount(); int rowCount = itemCount % mSpanCount == 0 ? itemCount / mSpanCount : itemCount / mSpanCount + 1;//计算总行数 if (mDividerIndex >= rowCount - 1) { isRedrawDivider = false; } int rowNum = (itemPosition + 1) % mSpanCount == 0 ? (itemPosition + 1) / mSpanCount : (itemPosition + 1) / mSpanCount + 1;//计算第几行 if ((rowNum - 1) == mDividerIndex) { bottom = mRedrawDividerHeight; } else if (mDividerIndex + 1 == rowNum - 1) { top = mRedrawDividerHeight; } } //</editor-fold> } else { if (noDrawHeaderDivider) { if (itemPosition % mSpanCount == 0) { Logd(TAG, "getItemOffsets: noDrawHeaderDivider:" + itemPosition); top = 0; } } if (noDrawFooterDivider) { if (itemPosition % mSpanCount == mSpanCount - 1) { Loge(TAG, "getItemOffsets: noDrawFooterDivider:" + itemPosition); bottom = 0; } } //<editor-fold desc="最左边分割线绘制与定制"> if (noDrawLeftDivider) { if (mSpanCount > itemPosition) { Loge(TAG, "getItemOffsets: noDrawLeftDivider:" + itemPosition); left = 0; } } else { if (isRedrawLeftDivider) { if (mSpanCount > itemPosition) { Loge(TAG, "getItemOffsets: isRedrawLeftDivider:" + itemPosition); left = mLeftDividerWidth; } } } //</editor-fold> //<editor-fold desc="最右边分割线绘制与定制"> if (noDrawRightDivider) { int itemCount = parent.getAdapter().getItemCount(); int columnCount = itemCount % mSpanCount == 0 ? itemCount / mSpanCount - 1 : itemCount / mSpanCount; if (columnCount * mSpanCount <= itemPosition) { right = 0; } } else { if (isRedrawRightDivider) { int itemCount = parent.getAdapter().getItemCount(); int columnCount = itemCount % mSpanCount == 0 ? itemCount / mSpanCount - 1 : itemCount / mSpanCount; if (columnCount * mSpanCount <= itemPosition) { right = mRightDividerWidth; } } } //</editor-fold> //<editor-fold desc="分割线批量定制"> if (isSubDivider) { int itemCount = parent.getAdapter().getItemCount(); int rowCount = itemCount % mSpanCount == 0 ? itemCount / mSpanCount : itemCount / mSpanCount + 1; if (mStartIndex >= rowCount - 1) { isSubDivider = false; } else { int rowNum = (itemPosition + 1) % mSpanCount == 0 ? (itemPosition + 1) / mSpanCount - 1 : (itemPosition + 1) / mSpanCount;//计算第几行 if (rowNum > mStartIndex) { int maxRow = Math.min(mEndIndex, rowCount - 1); if (rowNum < maxRow) { left = mSubDividerWidth; right = mSubDividerWidth; } else if (rowNum == maxRow) { left = mSubDividerWidth; } } else if (rowNum == mStartIndex) { right = mSubDividerWidth; } } } //</editor-fold> //<editor-fold desc="分割线定制"> if (isRedrawDivider) { int itemCount = parent.getAdapter().getItemCount(); int rowCount = itemCount % mSpanCount == 0 ? itemCount / mSpanCount : itemCount / mSpanCount + 1;//计算总行数 if (mDividerIndex >= rowCount - 1) { isRedrawDivider = false; } int rowNum = (itemPosition + 1) % mSpanCount == 0 ? (itemPosition + 1) / mSpanCount : (itemPosition + 1) / mSpanCount + 1;//计算第几行 if ((rowNum - 1) == mDividerIndex) { right = mRedrawDividerWidth; } else if (mDividerIndex + 1 == rowNum - 1) { left = mRedrawDividerWidth; } } //</editor-fold> } /* * left:代表item的左边分割线占有的x轴长度 * top:代表item的顶部分割线占有的y轴长度 * right:代表item的右边分割线占有的x轴长度 * bottom:代表item的底部分割线占有的y轴长度 * */ if (isShowOtherStyle) { outRect.set(0, top, right, 0); } else { outRect.set(left, top, right, bottom); } } public static class Builder extends BaseBuilder { private int mSpanCount = 1; private boolean isSticky;//固定头部 private int mStickyHeightOrWidth;//固定头部高度或宽度 private Drawable mStickyDrawable;//固定头部样式 private int mStickyTextPaddingLeft = 48;//固定头部的文本左边距 private int mStickyTextPaddingTop = 60;//固定头部的文本上边距 private int mStickyTextColor = Color.WHITE;//固定头部的文本的字体颜色 private int mStickyTextSize = 42;//固定头部的文本的字体大小 public Builder(Context context, int mSpanCount) { super(context, GRID); this.mSpanCount = mSpanCount; if (this.mSpanCount == 1) { noDrawLeftDivider = true; noDrawRightDivider = true; } } public Builder(Context context, int mOrientation, int mSpanCount) { super(context, GRID, mOrientation); this.mSpanCount = mSpanCount; if (this.mSpanCount == 1) { noDrawLeftDivider = true; noDrawRightDivider = true; } } public BaseBuilder setShowOtherStyle(boolean showOtherStyle) { this.isShowOtherStyle = showOtherStyle; return this; } public Builder setSticky(boolean sticky) { isSticky = sticky; return this; } public Builder setStickyHeightOrWidth(@IntRange(from = 0) int stickyHeaderHeight) { this.mStickyHeightOrWidth = stickyHeaderHeight; return this; } public Builder setStickyDrawable(@DrawableRes int drawableId) { this.mStickyDrawable = ContextCompat.getDrawable(mContext.getApplicationContext(), drawableId); ; if (this.mStickyHeightOrWidth == 0) { this.mStickyHeightOrWidth = mStickyDrawable.getIntrinsicHeight(); } return this; } public Builder setStickyTextPaddingLeft(int textPaddingLeft) { this.mStickyTextPaddingLeft = textPaddingLeft; return this; } public Builder setStickyTextPaddingTop(int textPaddingTop) { this.mStickyTextPaddingTop = textPaddingTop; return this; } /** * @param textColor 颜色需为argb,否则不生效 * @return */ public Builder setStickyTextColor(int textColor) { this.mStickyTextColor = textColor; return this; } public Builder setStickyTextSize(int textSize) { this.mStickyTextSize = textSize; return this; } public DividerGridItemDecoration build() { return new DividerGridItemDecoration(this); } } }