Java tutorial
/* * Copyright 2015 Soulwolf Ching * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package net.soulwolf.meetrecycle.decoration; import android.content.Context; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.support.annotation.DimenRes; import android.support.v4.view.ViewCompat; import android.support.v7.widget.RecyclerView; import android.view.View; /** * Created by yqritc on 2015/01/15. */ public class VerticalDividerItemDecoration extends FlexibleDividerDecoration { private MarginProvider mMarginProvider; protected VerticalDividerItemDecoration(Builder builder) { super(builder); mMarginProvider = builder.mMarginProvider; } @Override protected Rect getDividerBound(int position, RecyclerView parent, View child) { Rect bounds = new Rect(0, 0, 0, 0); int transitionX = (int) ViewCompat.getTranslationX(child); int transitionY = (int) ViewCompat.getTranslationY(child); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); bounds.top = parent.getPaddingTop() + mMarginProvider.dividerTopMargin(position, parent) + transitionY; bounds.bottom = parent.getHeight() - parent.getPaddingBottom() - mMarginProvider.dividerBottomMargin(position, parent) + transitionY; int dividerSize = getDividerSize(position, parent); if (mDividerType == DividerType.DRAWABLE) { bounds.left = child.getRight() + params.leftMargin + transitionX; bounds.right = bounds.left + dividerSize; } else { bounds.left = child.getRight() + params.leftMargin + dividerSize / 2 + transitionX; bounds.right = bounds.left; } return bounds; } @Override protected void setItemOffsets(Rect outRect, int position, RecyclerView parent) { outRect.set(0, 0, getDividerSize(position, parent), 0); } private int getDividerSize(int position, RecyclerView parent) { if (mPaintProvider != null) { return (int) mPaintProvider.dividerPaint(position, parent).getStrokeWidth(); } else if (mSizeProvider != null) { return mSizeProvider.dividerSize(position, parent); } else if (mDrawableProvider != null) { Drawable drawable = mDrawableProvider.drawableProvider(position, parent); return drawable.getIntrinsicWidth(); } throw new RuntimeException("failed to get size"); } /** * Interface for controlling divider margin */ public interface MarginProvider { /** * Returns top margin of divider. * * @param position Divider position * @param parent RecyclerView * @return top margin */ int dividerTopMargin(int position, RecyclerView parent); /** * Returns bottom margin of divider. * * @param position Divider position * @param parent RecyclerView * @return bottom margin */ int dividerBottomMargin(int position, RecyclerView parent); } public static class Builder extends FlexibleDividerDecoration.Builder<Builder> { private MarginProvider mMarginProvider = new MarginProvider() { @Override public int dividerTopMargin(int position, RecyclerView parent) { return 0; } @Override public int dividerBottomMargin(int position, RecyclerView parent) { return 0; } }; public Builder(Context context) { super(context); } public Builder margin(final int topMargin, final int bottomMargin) { return marginProvider(new MarginProvider() { @Override public int dividerTopMargin(int position, RecyclerView parent) { return topMargin; } @Override public int dividerBottomMargin(int position, RecyclerView parent) { return bottomMargin; } }); } public Builder margin(int verticalMargin) { return margin(verticalMargin, verticalMargin); } public Builder marginResId(@DimenRes int topMarginId, @DimenRes int bottomMarginId) { return margin(mResources.getDimensionPixelSize(topMarginId), mResources.getDimensionPixelSize(bottomMarginId)); } public Builder marginResId(@DimenRes int verticalMarginId) { return marginResId(verticalMarginId, verticalMarginId); } public Builder marginProvider(MarginProvider provider) { mMarginProvider = provider; return this; } public VerticalDividerItemDecoration build() { checkBuilderParams(); return new VerticalDividerItemDecoration(this); } } }