RecyclerView ItemDecoration 均分 Item 间隔

在 RecyclerView 中使用 ItemDecoration 重写 getItemOffsets 设置每个 Item 的间隔,支持各种 LayoutManager:

SpacingItemDecoration.java
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
public class SpacingItemDecoration extends RecyclerView.ItemDecoration {

private int spanCount;
private int spacing;
private boolean includeEdge;

public SpacingItemDecoration(int spacing, int spanCount, boolean includeEdge) {
this.spacing = spacing;
this.spanCount = spanCount;
this.includeEdge = includeEdge;
}

@Override
public void getItemOffsets(@NotNull Rect outRect, @NotNull View view, RecyclerView parent,
@NotNull RecyclerView.State state) {
int position = parent.getChildAdapterPosition(view);
int column = position % spanCount;

if (includeEdge) {
outRect.left = spacing - column * spacing / spanCount;
outRect.right = (column + 1) * spacing / spanCount;

if (position < spanCount) {
outRect.top = spacing;
}
outRect.bottom = spacing;
} else {
outRect.left = column * spacing / spanCount;
outRect.right = spacing - (column + 1) * spacing / spanCount;
if (position >= spanCount) {
outRect.top = spacing;
}
}
}
}