package com.marshalchen.common.uimodule.twowayview.widget; 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.RecyclerView; import android.support.v7.widget.RecyclerView.ItemDecoration; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup.MarginLayoutParams; import com.marshalchen.common.uimodule.R; /** * {@link android.support.v7.widget.RecyclerView.ItemDecoration} that draws * vertical and horizontal dividers between the items of the target * {@link android.support.v7.widget.RecyclerView}. */ public class DividerItemDecoration extends ItemDecoration { private final ItemSpacingOffsets mItemSpacing; private final Drawable mVerticalDivider; private final Drawable mHorizontalDivider; public DividerItemDecoration(Context context, AttributeSet attrs) { this(context, attrs, 0); } public DividerItemDecoration(Context context, AttributeSet attrs, int defStyle) { final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.twowayview_DividerItemDecoration, defStyle, 0); final Drawable divider = a.getDrawable(R.styleable.twowayview_DividerItemDecoration_android_divider); if (divider != null) { mVerticalDivider = mHorizontalDivider = divider; } else { mVerticalDivider = a.getDrawable(R.styleable.twowayview_DividerItemDecoration_twowayview_verticalDivider); mHorizontalDivider = a.getDrawable(R.styleable.twowayview_DividerItemDecoration_twowayview_horizontalDivider); } a.recycle(); mItemSpacing = createSpacing(mVerticalDivider, mHorizontalDivider); } public DividerItemDecoration(Drawable divider) { this(divider, divider); } public DividerItemDecoration(Drawable verticalDivider, Drawable horizontalDivider) { mVerticalDivider = verticalDivider; mHorizontalDivider = horizontalDivider; mItemSpacing = createSpacing(mVerticalDivider, mHorizontalDivider); } private static ItemSpacingOffsets createSpacing(Drawable verticalDivider, Drawable horizontalDivider) { final int verticalSpacing; if (horizontalDivider != null) { verticalSpacing = horizontalDivider.getIntrinsicHeight(); } else { verticalSpacing = 0; } final int horizontalSpacing; if (verticalDivider != null) { horizontalSpacing = verticalDivider.getIntrinsicWidth(); } else { horizontalSpacing = 0; } final ItemSpacingOffsets spacing = new ItemSpacingOffsets(verticalSpacing, horizontalSpacing); spacing.setAddSpacingAtEnd(true); return spacing; } @Override public void onDrawOver(Canvas c, RecyclerView parent) { final BaseLayoutManager lm = (BaseLayoutManager) parent.getLayoutManager(); final int rightWithPadding = parent.getWidth() - parent.getPaddingRight(); final int bottomWithPadding = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final int childLeft = lm.getDecoratedLeft(child); final int childTop = lm.getDecoratedTop(child); final int childRight = lm.getDecoratedRight(child); final int childBottom = lm.getDecoratedBottom(child); final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams(); final int bottomOffset = childBottom - child.getBottom() - lp.bottomMargin; if (bottomOffset > 0 && childBottom < bottomWithPadding) { final int left = childLeft; final int top = childBottom - bottomOffset; final int right = childRight; final int bottom = top + mHorizontalDivider.getIntrinsicHeight(); mHorizontalDivider.setBounds(left, top, right, bottom); mHorizontalDivider.draw(c); } final int rightOffset = childRight - child.getRight() - lp.rightMargin; if (rightOffset > 0 && childRight < rightWithPadding) { final int left = childRight - rightOffset; final int top = childTop; final int right = left + mVerticalDivider.getIntrinsicWidth(); final int bottom = childBottom; mVerticalDivider.setBounds(left, top, right, bottom); mVerticalDivider.draw(c); } } } @Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { mItemSpacing.getItemOffsets(outRect, itemPosition, parent); } }