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;
}
}
}
}