public class GridDividerItemDecoration extends RecyclerView.ItemDecoration {
private final Paint paint;
private final int dividerWidth;
private final Context context;
public GridDividerItemDecoration(Context context, int dividerWidthDp, int dividerColorResId) {
this.context = context;
this.dividerWidth = dpToPx(context, dividerWidthDp);
paint = new Paint();
paint.setColor(ContextCompat.getColor(context, dividerColorResId));
paint.setStyle(Paint.Style.FILL);
}
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
int position = parent.getChildAdapterPosition(view);
if (position == RecyclerView.NO_POSITION) return;
GridLayoutManager layoutManager = (GridLayoutManager) parent.getLayoutManager();
int spanCount = layoutManager.getSpanCount();
int itemCount = parent.getAdapter().getItemCount();
boolean isLastColumn = (position + 1) % spanCount == 0;
boolean isLastRow = position >= itemCount - (itemCount % spanCount == 0 ? spanCount : itemCount % spanCount);
outRect.right = isLastColumn ? 0 : dividerWidth;
outRect.bottom = isLastRow ? 0 : dividerWidth;
}
@Override
public void onDraw(@NonNull Canvas canvas, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
GridLayoutManager layoutManager = (GridLayoutManager) parent.getLayoutManager();
int spanCount = layoutManager.getSpanCount();
for (int i = 0; i < parent.getChildCount(); i++) {
View child = parent.getChildAt(i);
int position = parent.getChildAdapterPosition(child);
if (position == RecyclerView.NO_POSITION) return;
int itemCount = parent.getAdapter().getItemCount();
boolean isLastColumn = (position + 1) % spanCount == 0;
boolean isLastRow = position >= itemCount - (itemCount % spanCount == 0 ? spanCount : itemCount % spanCount);
// 右侧分割线
if (!isLastColumn) {
canvas.drawRect(
child.getRight(),
child.getTop(),
child.getRight() + dividerWidth,
child.getBottom(),
paint
);
}
// 底部分割线
if (!isLastRow) {
canvas.drawRect(
child.getLeft(),
child.getBottom(),
child.getRight()+ dividerWidth,
child.getBottom() + dividerWidth,
paint
);
}
}
}
private static int dpToPx(Context context, float dp) {
return (int) (dp * context.getResources().getDisplayMetrics().density + 0.5f);
}
}
代码由腾讯元宝deepseek生成+个人修正(绘制底部分割线时child.getRight()+ dividerWidth,否则分割线太粗时交点空心),使用方法如下:
recycleview.addItemDecoration(new GridDividerItemDecoration(this,10,R.color.line_gray));