public boolean hasNewHeader(int position, boolean isReverseLayout) {
    if (indexOutOfBounds(position)) {
      return false;
    }

    long headerId = mAdapter.getHeaderId(position);

    if (headerId < 0) {
      return false;
    }

    long nextItemHeaderId = -1;
    int nextItemPosition = position + (isReverseLayout? 1: -1);
    if (!indexOutOfBounds(nextItemPosition)){
      nextItemHeaderId = mAdapter.getHeaderId(nextItemPosition);
    }
    int firstItemPosition = isReverseLayout? mAdapter.getItemCount()-1 : 0;

    return position == firstItemPosition || headerId != nextItemHeaderId;
  }
Determines if an item in the list should have a header that is different than the item in the
list that immediately precedes it. Items with no headers will always return false.

@param position of the list item in questions
@param isReverseLayout TRUE if layout manager has flag isReverseLayout
@return true if this item has a different header than the previous item in the list
library/src/main/java/com/timehop/stickyheadersrecyclerview/HeaderPositionCalculator.java