package com.marverenic.music.view;
import android.graphics.Rect;
import android.support.v7.widget.RecyclerView;
import android.view.View;
public class GridSpacingDecoration extends RecyclerView.ItemDecoration {
private static final int ANY_VIEW = -1;
private int spacing;
private int numColumns;
private int viewType;
/**
* Create a new ItemDecorator for use with a RecyclerView
* @param spacing The padding around elements in a grid
* @param numColumns The number of columns in this grid. Use the same value as set by
* {@link android.support.v7.widget.GridLayoutManager#setSpanCount(int)}
*/
public GridSpacingDecoration(int spacing, int numColumns) {
this(spacing, numColumns, ANY_VIEW);
}
/**
* Create a new ItemDecorator for use with a RecyclerView
* @param spacing The padding around elements in a grid
* @param numColumns The number of columns in this grid. Use the same value as set by
* {@link android.support.v7.widget.GridLayoutManager#setSpanCount(int)}
* @param viewType The type of view that should be padded in a grid. Use the same value as
* {@link android.support.v7.widget.RecyclerView.Adapter#getItemViewType(int)}
*/
public GridSpacingDecoration(int spacing, int numColumns, int viewType) {
this.spacing = spacing;
this.numColumns = numColumns;
this.viewType = viewType;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
RecyclerView.Adapter adapter = parent.getAdapter();
int adapterPosition = parent.getChildAdapterPosition(view);
if (viewType == ANY_VIEW || adapter.getItemViewType(adapterPosition) == viewType) {
int halfSpacing = spacing / 2;
int sectionPosition;
int childCount;
int column;
if (viewType != ANY_VIEW) {
int leadingViews = 0;
while (adapter.getItemViewType(leadingViews) != viewType) {
++leadingViews;
}
sectionPosition = adapterPosition - leadingViews;
column = sectionPosition % numColumns;
childCount = 0;
while (childCount + leadingViews < adapter.getItemCount()
&& adapter.getItemViewType(childCount + leadingViews) == viewType) {
++childCount;
}
} else {
sectionPosition = adapterPosition;
childCount = parent.getAdapter().getItemCount();
column = adapterPosition % numColumns;
}
outRect.top = halfSpacing;
outRect.bottom = halfSpacing;
if (ViewUtils.isRtl(view.getContext())) {
outRect.right = spacing * (numColumns - column) / numColumns;
outRect.left = spacing * (column + 1) / numColumns;
} else {
outRect.left = spacing * (numColumns - column) / numColumns;
outRect.right = spacing * (column + 1) / numColumns;
}
// Items in the first row
if (sectionPosition < numColumns) {
outRect.top = spacing;
}
// Items in the last row
int lastRowItemCount = childCount % numColumns;
// If the last row is completely filled, the mod operation will suggest that the
// last row is empty
if (lastRowItemCount == 0) {
lastRowItemCount = numColumns;
}
if (sectionPosition >= childCount - lastRowItemCount) {
outRect.bottom = spacing;
}
}
}
}