Skip to content

Instantly share code, notes, and snippets.

@lapastillaroja
Forked from akmalxxx/DividerItemDecoration.java
Last active November 17, 2023 23:06

Revisions

  1. lapastillaroja renamed this gist Dec 10, 2014. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  2. lapastillaroja revised this gist Dec 10, 2014. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion README.me
    Original file line number Diff line number Diff line change
    @@ -21,4 +21,4 @@ Custom divider with first also end and last dividers
    mCategoryRecyclerView.addItemDecoration(
    new DividerItemDecoration(getActivity().getDrawable(R.drawable.ic_launcher),
    true, true));
    ```
    ```
  3. lapastillaroja revised this gist Dec 10, 2014. 2 changed files with 140 additions and 68 deletions.
    184 changes: 116 additions & 68 deletions DividerItemDecoration.java
    Original file line number Diff line number Diff line change
    @@ -1,75 +1,123 @@
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.util.AttributeSet;
    import android.support.v7.widget.RecyclerView;
    import android.support.v7.widget.LinearLayoutManager;
    import android.view.View;
    import android.graphics.Canvas;
    import android.graphics.Rect;
    import android.graphics.drawable.Drawable;
    import android.graphics.Canvas;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.util.AttributeSet;
    import android.view.View;

    public class DividerItemDecoration extends RecyclerView.ItemDecoration {

    private Drawable mDivider;

    public DividerItemDecoration(Context context, AttributeSet attrs) {
    final TypedArray a = context.obtainStyledAttributes(attrs, new int [] { android.R.attr.listDivider });
    mDivider = a.getDrawable(0);
    a.recycle();
    }

    public DividerItemDecoration(Drawable divider) { mDivider = divider; }

    @Override
    public void getItemOffsets (Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
    super.getItemOffsets(outRect, view, parent, state);
    if (mDivider == null) return;
    if (parent.getChildPosition(view) < 1) return;

    if (getOrientation(parent) == LinearLayoutManager.VERTICAL) outRect.top = mDivider.getIntrinsicHeight();
    else outRect.left = mDivider.getIntrinsicWidth();
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent) {
    if (mDivider == null) { super.onDrawOver(c, parent); return; }

    if (getOrientation(parent) == LinearLayoutManager.VERTICAL) {
    final int left = parent.getPaddingLeft();
    final int right = parent.getWidth() - parent.getPaddingRight();
    final int childCount = parent.getChildCount();

    for (int i=1; i < childCount; i++) {
    final View child = parent.getChildAt(i);
    final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
    final int size = mDivider.getIntrinsicHeight();
    final int top = child.getTop() - params.topMargin;
    final int bottom = top + size;
    mDivider.setBounds(left, top, right, bottom);
    mDivider.draw(c);
    }
    } else { //horizontal
    final int top = parent.getPaddingTop();
    final int bottom = parent.getHeight() - parent.getPaddingBottom();
    final int childCount = parent.getChildCount();

    for (int i=1; i < childCount; i++) {
    final View child = parent.getChildAt(i);
    final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
    final int size = mDivider.getIntrinsicWidth();
    final int left = child.getLeft() - params.leftMargin;
    final int right = left + size;
    mDivider.setBounds(left, top, right, bottom);
    mDivider.draw(c);
    }
    }
    }

    private int getOrientation(RecyclerView parent) {
    if (parent.getLayoutManager() instanceof LinearLayoutManager) {
    LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
    return layoutManager.getOrientation();
    } else throw new IllegalStateException("DividerItemDecoration can only be used with a LinearLayoutManager.");
    }

    }
    private Drawable mDivider;
    private boolean mShowFirstDivider = false;
    private boolean mShowLastDivider = false;


    public DividerItemDecoration(Context context, AttributeSet attrs) {
    final TypedArray a = context
    .obtainStyledAttributes(attrs, new int[]{android.R.attr.listDivider});
    mDivider = a.getDrawable(0);
    a.recycle();
    }

    public DividerItemDecoration(Context context, AttributeSet attrs, boolean showFirstDivider,
    boolean showLastDivider) {
    this(context, attrs);
    mShowFirstDivider = showFirstDivider;
    mShowLastDivider = showLastDivider;
    }

    public DividerItemDecoration(Drawable divider) {
    mDivider = divider;
    }

    public DividerItemDecoration(Drawable divider, boolean showFirstDivider,
    boolean showLastDivider) {
    this(divider);
    mShowFirstDivider = showFirstDivider;
    mShowLastDivider = showLastDivider;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
    RecyclerView.State state) {
    super.getItemOffsets(outRect, view, parent, state);
    if (mDivider == null) {
    return;
    }
    if (parent.getChildPosition(view) < 1) {
    return;
    }

    if (getOrientation(parent) == LinearLayoutManager.VERTICAL) {
    outRect.top = mDivider.getIntrinsicHeight();
    } else {
    outRect.left = mDivider.getIntrinsicWidth();
    }
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
    if (mDivider == null) {
    super.onDrawOver(c, parent, state);
    return;
    }

    // Initialization needed to avoid compiler warning
    int left = 0, right = 0, top = 0, bottom = 0, size;
    int orientation = getOrientation(parent);
    int childCount = parent.getChildCount();

    if (orientation == LinearLayoutManager.VERTICAL) {
    size = mDivider.getIntrinsicHeight();
    left = parent.getPaddingLeft();
    right = parent.getWidth() - parent.getPaddingRight();
    } else { //horizontal
    size = mDivider.getIntrinsicWidth();
    top = parent.getPaddingTop();
    bottom = parent.getHeight() - parent.getPaddingBottom();
    }

    for (int i = mShowFirstDivider ? 0 : 1; i < childCount; i++) {
    View child = parent.getChildAt(i);
    RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

    if (orientation == LinearLayoutManager.VERTICAL) {
    top = child.getTop() - params.topMargin;
    bottom = top + size;
    } else { //horizontal
    left = child.getLeft() - params.leftMargin;
    right = left + size;
    }
    mDivider.setBounds(left, top, right, bottom);
    mDivider.draw(c);
    }

    // show last divider
    if (mShowLastDivider && childCount > 0) {
    View child = parent.getChildAt(childCount - 1);
    RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
    if (orientation == LinearLayoutManager.VERTICAL) {
    top = child.getBottom() + params.bottomMargin;
    bottom = top + size;
    } else { // horizontal
    left = child.getRight() + params.rightMargin;
    right = left + size;
    }
    mDivider.setBounds(left, top, right, bottom);
    mDivider.draw(c);
    }
    }

    private int getOrientation(RecyclerView parent) {
    if (parent.getLayoutManager() instanceof LinearLayoutManager) {
    LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
    return layoutManager.getOrientation();
    } else {
    throw new IllegalStateException(
    "DividerItemDecoration can only be used with a LinearLayoutManager.");
    }
    }
    }
    24 changes: 24 additions & 0 deletions README.me
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,24 @@
    # DividerItemDecoration

    Simple RecyclerView ItemDecoration
    Based on [fatfingers](https://gist.github.com/fatfingers/233abbae200b5e87297b) implementation.

    ## Features
    - Can use any drawable as divider
    - Divider visible also at the beginning and end of the item's list (disable by deffault)
    - Only works with `LinearLayoutManager`

    ## Example

    Default android divider
    ```java
    mCategoryRecyclerView.addItemDecoration(
    new DividerItemDecoration(getActivity(), null));
    ```

    Custom divider with first also end and last dividers
    ```java
    mCategoryRecyclerView.addItemDecoration(
    new DividerItemDecoration(getActivity().getDrawable(R.drawable.ic_launcher),
    true, true));
    ```
  4. @akmalxxx akmalxxx created this gist Oct 29, 2014.
    75 changes: 75 additions & 0 deletions DividerItemDecoration.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,75 @@
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.util.AttributeSet;
    import android.support.v7.widget.RecyclerView;
    import android.support.v7.widget.LinearLayoutManager;
    import android.view.View;
    import android.graphics.Rect;
    import android.graphics.drawable.Drawable;
    import android.graphics.Canvas;

    public class DividerItemDecoration extends RecyclerView.ItemDecoration {

    private Drawable mDivider;

    public DividerItemDecoration(Context context, AttributeSet attrs) {
    final TypedArray a = context.obtainStyledAttributes(attrs, new int [] { android.R.attr.listDivider });
    mDivider = a.getDrawable(0);
    a.recycle();
    }

    public DividerItemDecoration(Drawable divider) { mDivider = divider; }

    @Override
    public void getItemOffsets (Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
    super.getItemOffsets(outRect, view, parent, state);
    if (mDivider == null) return;
    if (parent.getChildPosition(view) < 1) return;

    if (getOrientation(parent) == LinearLayoutManager.VERTICAL) outRect.top = mDivider.getIntrinsicHeight();
    else outRect.left = mDivider.getIntrinsicWidth();
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent) {
    if (mDivider == null) { super.onDrawOver(c, parent); return; }

    if (getOrientation(parent) == LinearLayoutManager.VERTICAL) {
    final int left = parent.getPaddingLeft();
    final int right = parent.getWidth() - parent.getPaddingRight();
    final int childCount = parent.getChildCount();

    for (int i=1; i < childCount; i++) {
    final View child = parent.getChildAt(i);
    final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
    final int size = mDivider.getIntrinsicHeight();
    final int top = child.getTop() - params.topMargin;
    final int bottom = top + size;
    mDivider.setBounds(left, top, right, bottom);
    mDivider.draw(c);
    }
    } else { //horizontal
    final int top = parent.getPaddingTop();
    final int bottom = parent.getHeight() - parent.getPaddingBottom();
    final int childCount = parent.getChildCount();

    for (int i=1; i < childCount; i++) {
    final View child = parent.getChildAt(i);
    final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
    final int size = mDivider.getIntrinsicWidth();
    final int left = child.getLeft() - params.leftMargin;
    final int right = left + size;
    mDivider.setBounds(left, top, right, bottom);
    mDivider.draw(c);
    }
    }
    }

    private int getOrientation(RecyclerView parent) {
    if (parent.getLayoutManager() instanceof LinearLayoutManager) {
    LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
    return layoutManager.getOrientation();
    } else throw new IllegalStateException("DividerItemDecoration can only be used with a LinearLayoutManager.");
    }

    }