Skip to content

Instantly share code, notes, and snippets.

@alexfu
Last active September 17, 2024 09:36

Revisions

  1. alexfu revised this gist Jan 14, 2016. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions results.md
    Original file line number Diff line number Diff line change
    @@ -1,5 +1,5 @@
    ## BEFORE
    <img src="http://i.imgur.com/gYoIvID.png" width="100" alt="before">
    <img src="http://i.imgur.com/gYoIvID.png" width="400" alt="before">

    ## AFTER
    <img src="http://i.imgur.com/xTiItWa.png" width="100" alt="after">
    <img src="http://i.imgur.com/xTiItWa.png" width="400" alt="after">
  2. alexfu revised this gist Jan 14, 2016. 1 changed file with 5 additions and 0 deletions.
    5 changes: 5 additions & 0 deletions results.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,5 @@
    ## BEFORE
    <img src="http://i.imgur.com/gYoIvID.png" width="100" alt="before">

    ## AFTER
    <img src="http://i.imgur.com/xTiItWa.png" width="100" alt="after">
  3. alexfu created this gist Jan 14, 2016.
    74 changes: 74 additions & 0 deletions EqualSpacingItemDecoration.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,74 @@
    import android.graphics.Rect;
    import android.support.v7.widget.GridLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.view.View;

    public class EqualSpacingItemDecoration extends RecyclerView.ItemDecoration {
    private final int spacing;
    private int displayMode;

    public static final int HORIZONTAL = 0;
    public static final int VERTICAL = 1;
    public static final int GRID = 2;

    public EqualSpacingItemDecoration(int spacing) {
    this(spacing, -1);
    }

    public EqualSpacingItemDecoration(int spacing, int displayMode) {
    this.spacing = spacing;
    this.displayMode = displayMode;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
    int position = parent.getChildViewHolder(view).getAdapterPosition();
    int itemCount = state.getItemCount();
    RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
    setSpacingForDirection(outRect, layoutManager, position, itemCount);
    }

    private void setSpacingForDirection(Rect outRect,
    RecyclerView.LayoutManager layoutManager,
    int position,
    int itemCount) {

    // Resolve display mode automatically
    if (displayMode == -1) {
    displayMode = resolveDisplayMode(layoutManager);
    }

    switch (displayMode) {
    case HORIZONTAL:
    outRect.left = spacing;
    outRect.right = position == itemCount - 1 ? spacing : 0;
    outRect.top = spacing;
    outRect.bottom = spacing;
    break;
    case VERTICAL:
    outRect.left = spacing;
    outRect.right = spacing;
    outRect.top = spacing;
    outRect.bottom = position == itemCount - 1 ? spacing : 0;
    break;
    case GRID:
    if (layoutManager instanceof GridLayoutManager) {
    GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
    int cols = gridLayoutManager.getSpanCount();
    int rows = itemCount / cols;

    outRect.left = spacing;
    outRect.right = position % cols == cols - 1 ? spacing : 0;
    outRect.top = spacing;
    outRect.bottom = position / cols == rows - 1 ? spacing : 0;
    }
    break;
    }
    }

    private int resolveDisplayMode(RecyclerView.LayoutManager layoutManager) {
    if (layoutManager instanceof GridLayoutManager) return GRID;
    if (layoutManager.canScrollHorizontally()) return HORIZONTAL;
    return VERTICAL;
    }
    }
    11 changes: 11 additions & 0 deletions example.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,11 @@
    // Automatically infer display orientation of items
    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
    recyclerView.addItemDecoration(new EqualSpacingItemDecoration(16)); // 16px. In practice, you'll want to use getDimensionPixelSize

    // Explicitly specify display orientation of items.
    // Available display modes:
    // - HORIZONTAL
    // - VERTICAL
    // - GRID
    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
    recyclerView.addItemDecoration(new EqualSpacingItemDecoration(16, EqualSpacingItemDecoration.HORIZONTAL)); // 16px. In practice, you'll want to use getDimensionPixelSize