package com.lin.poweradapter; 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.annotation.DrawableRes; import android.support.annotation.IntRange; import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewCompat; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.OrientationHelper; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.View; public class SpaceItemDecoration extends RecyclerView.ItemDecoration { private Drawable mDivider; private int mSectionOffsetV; private int mSectionOffsetH; private boolean mDrawOver = true, withOffset = false; private static final int[] ATTRS = new int[]{ android.R.attr.listDivider }; public SpaceItemDecoration(Context context) { final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS); mDivider = styledAttributes.getDrawable(0); styledAttributes.recycle(); } public SpaceItemDecoration(@NonNull Context context, @DrawableRes int resId) { this(context, resId, 0); } public SpaceItemDecoration(@NonNull Context context, @DrawableRes int resId, @IntRange(from = 0) int sectionOffset) { this(context, resId, sectionOffset, 0); } public SpaceItemDecoration(@NonNull Context context, @DrawableRes int resId, @IntRange(from = 0) int sectionOffsetV, @IntRange(from = 0) int sectionOffsetH) { if (resId > 0) mDivider = ContextCompat.getDrawable(context, resId); mSectionOffsetV = (int) (context.getResources().getDisplayMetrics().density * sectionOffsetV); mSectionOffsetH = (int) (context.getResources().getDisplayMetrics().density * sectionOffsetH); } public SpaceItemDecoration withDrawOver(boolean drawOver) { this.mDrawOver = drawOver; return this; } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { if (mDivider != null && !mDrawOver) { draw(c, parent); } } @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { if (mDivider != null && mDrawOver) { draw(c, parent); } } private void draw(Canvas c, RecyclerView parent) { int left = parent.getPaddingLeft(); int right = parent.getWidth() - parent.getPaddingRight(); int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); int top = child.getBottom() + params.bottomMargin + Math.round(ViewCompat.getTranslationY(child)); int bottom = top + (mDivider.getIntrinsicHeight() <= 0 ? 1 : mDivider.getIntrinsicHeight()); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } public SpaceItemDecoration withOffset(boolean withOffset) { this.withOffset = withOffset; return this; } /** * */ @SuppressWarnings({"ConstantConditions", "unchecked", "SuspiciousNameCombination"}) @Override public void getItemOffsets(Rect outRect, View view, RecyclerView recyclerView, RecyclerView.State state) { if (getOrientation(recyclerView.getLayoutManager()) == RecyclerView.VERTICAL) { outRect.set(mSectionOffsetH, 0, mSectionOffsetH, mSectionOffsetV); } else { outRect.set(0, 0, mSectionOffsetV, 0); } } public static int getOrientation(RecyclerView.LayoutManager layoutManager) { if (layoutManager instanceof LinearLayoutManager) { return ((LinearLayoutManager) layoutManager).getOrientation(); } else if (layoutManager instanceof StaggeredGridLayoutManager) { return ((StaggeredGridLayoutManager) layoutManager).getOrientation(); } return OrientationHelper.HORIZONTAL; } }