package com.timehop.stickyheadersrecyclerview.sample;

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.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;


public class DividerDecoration extends RecyclerView.ItemDecoration {

  private static final int[] ATTRS = new int[]{
      android.R.attr.listDivider
  };

  public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;

  public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;

  private Drawable mDivider;

  public DividerDecoration(Context context) {
    final TypedArray a = context.obtainStyledAttributes(ATTRS);
    mDivider = a.getDrawable(0);
    a.recycle();
  }

  private int getOrientation(RecyclerView parent) {
    LinearLayoutManager layoutManager;
    try {
      layoutManager = (LinearLayoutManager) parent.getLayoutManager();
    } catch (ClassCastException e) {
      throw new IllegalStateException("DividerDecoration can only be used with a " +
          "LinearLayoutManager.", e);
    }
    return layoutManager.getOrientation();
  }

  @Override
  public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
    super.onDraw(c, parent, state);

    if (getOrientation(parent) == VERTICAL_LIST) {
      drawVertical(c, parent);
    } else {
      drawHorizontal(c, parent);
    }
  }

  public void drawVertical(Canvas c, RecyclerView parent) {
    final int left = parent.getPaddingLeft();
    final int right = parent.getWidth() - parent.getPaddingRight();

    final int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
      final View child = parent.getChildAt(i);
      final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
          .getLayoutParams();
      final int top = child.getBottom() + params.bottomMargin;
      final int bottom = top + mDivider.getIntrinsicHeight();
      mDivider.setBounds(left, top, right, bottom);
      mDivider.draw(c);
    }
  }

  public void drawHorizontal(Canvas c, RecyclerView parent) {
    final int top = parent.getPaddingTop();
    final int bottom = parent.getHeight() - parent.getPaddingBottom();

    final int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
      final View child = parent.getChildAt(i);
      final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
          .getLayoutParams();
      final int left = child.getRight() + params.rightMargin;
      final int right = left + mDivider.getIntrinsicHeight();
      mDivider.setBounds(left, top, right, bottom);
      mDivider.draw(c);
    }
  }

  @Override
  public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
    super.getItemOffsets(outRect, view, parent, state);
    if (getOrientation(parent) == VERTICAL_LIST) {
      outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
    } else {
      outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
    }
  }
}
@@ -1679,25 +1679,163 @@
 ingRight();%0A
+    final int recyclerViewTop = parent.getPaddingTop();%0A    final int recyclerViewBottom = parent.getHeight() - parent.getPaddingBottom();
 %0A
-
     final in
@@ -2095,16 +2095,42 @@
 nt top =
+ Math.max(recyclerViewTop,
  child.g
@@ -2157,24 +2157,25 @@
 bottomMargin
+)
 ;%0A      fina
@@ -2188,16 +2188,45 @@
 bottom =
+ Math.min(recyclerViewBottom,
  top + m
@@ -2245,32 +2245,33 @@
 ntrinsicHeight()
+)
 ;%0A      mDivider
@@ -2520,17 +2520,154 @@
 ttom();%0A
+    final int recyclerViewLeft = parent.getPaddingLeft();%0A    final int recyclerViewRight = parent.getWidth() - parent.getPaddingRight();
 %0A
-
     fina
@@ -2932,16 +2932,43 @@
 t left =
+ Math.max(recyclerViewLeft,
  child.g
@@ -2997,16 +2997,17 @@
 htMargin
+)
 ;%0A      
@@ -3023,16 +3023,44 @@
  right =
+ Math.min(recyclerViewRight,
  left + 
@@ -3084,24 +3084,25 @@
 nsicHeight()
+)
 ;%0A      mDiv

Fix issue with dividers being drawn in padding