https://juejin.cn/post/7198351099119058981
分割线
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.view.View;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.RecyclerView;
/**
* 分割线 去掉了第一个和最后一个分割线
*/
public class MyDecoration extends DividerItemDecoration {
private int pos = -1;
/**
* Creates a divider {@link RecyclerView.ItemDecoration} that can be used with a
* {@link LinearLayoutManager}.
*
* @param context Current context, it will be used to access resources.
* @param orientation Divider orientation. Should be {@link #HORIZONTAL} or {@link #VERTICAL}.
*/
public MyDecoration(Context context, int orientation) {
super(context, orientation);
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
drawVertical(c, parent);
}
private final Rect mBounds = new Rect();
private void drawVertical(Canvas canvas, RecyclerView parent) {
canvas.save();
final int left;
final int right;
//noinspection AndroidLintNewApi - NewApi lint fails to handle overrides.
if (parent.getClipToPadding()) {
left = parent.getPaddingLeft();
right = parent.getWidth() - parent.getPaddingRight();
canvas.clipRect(left, parent.getPaddingTop(), right,
parent.getHeight() - parent.getPaddingBottom());
} else {
left = 0;
right = parent.getWidth();
}
final int childCount = parent.getChildCount();
//int i = 1 跳过第一行
//i < childCount-1 到最后一行
//i < childCount最后一行的末尾还会加分割线
for (int i = 1; i < childCount - 1; i++) {
final View child = parent.getChildAt(i);
parent.getDecoratedBoundsWithMargins(child, mBounds);
final int bottom = mBounds.bottom + Math.round(child.getTranslationY());
final int top = bottom - getDrawable().getIntrinsicHeight();
getDrawable().setBounds(left, top, right, bottom);
getDrawable().draw(canvas);
}
canvas.restore();
}
}
item间的空白
public class SpaceItemTopDecoration extends RecyclerView.ItemDecoration {
private int space = 0;
/**
* @param space 行间距大小 px
*/
public SpaceItemTopDecoration(int space) {
this.space = space;
}
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
if (parent.getChildAdapterPosition(view) != 0) {//第一行除外
outRect.top = space;
}
if (parent.getChildAdapterPosition(view)==parent.getChildCount()-1) {
// 最后一行底部增加距离,展示阴影效果
outRect.bottom = space;
}
}
}
另一个间隔
/**
* RecyclerView item间隔
*/
public class RvItemDecoration extends RecyclerView.ItemDecoration {
private final int spacing;
/**
* 单位dp
*/
public RvItemDecoration(int spacing) {
this.spacing = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, spacing, getResources().getDisplayMetrics());
}
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
outRect.left = spacing;
outRect.right = spacing;
outRect.bottom = spacing;
// 如果是第一个项,top spacing 可以根据需求设置
if (parent.getChildAdapterPosition(view) == 0) {
outRect.top = spacing;
} else {
outRect.top = 0; // 或者设置为其他值
}
}
}