1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| new RecyclerView.ItemDecoration() { private final float spaceSize = (ViewUtils.getScreenWidth() - ViewUtils.dpToPx(28)) / 4.0f; private final int itemSize = ViewUtils.dpToPx(67);
@Override public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { GridLayoutManager lm = (GridLayoutManager) parent.getLayoutManager(); int pos = parent.getChildLayoutPosition(view); if (lm != null) { int sps = lm.getSpanSizeLookup().getSpanSize(pos); if (sps != 1) { return; } float n = (spaceSize - itemSize) * lm.getSpanCount() / (lm.getSpanCount() - 1); int layoutPos = 0; for (int i = 0; i < pos; i++) { int sc = lm.getSpanSizeLookup().getSpanSize(i); if (sc != 1) { if (layoutPos % lm.getSpanCount() != 0) { layoutPos += (lm.getSpanCount() - layoutPos % lm.getSpanCount()); } } layoutPos += sc; } int c = layoutPos % lm.getSpanCount(); float p = c * itemSize + c * n; float cp = c * spaceSize + (spaceSize - itemSize) / 2; if (cp < p) { outRect.left = Math.round(p - cp + (spaceSize - itemSize) / 2); outRect.right = Math.round((spaceSize - itemSize)) - outRect.left; } else if (cp > p) { outRect.right = Math.round(cp - p + (spaceSize - itemSize) / 2); outRect.left = Math.round((spaceSize - itemSize)) - outRect.right; } } } }
|