要在 Android RecyclerView 的头部和尾部设置圆角,可以使用 ItemDecoration。具体的实现步骤如下:
1. 创建自定义的 ItemDecoration 类,并在该类的构造函数中传入圆角半径大小等参数。
2. 在该类的 `onDraw()` 方法中,使用 `Canvas` 和 `Paint` 对象绘制圆角矩形。可以通过 `getItemOffsets()` 方法来设置矩形的偏移量,以避免覆盖到 RecyclerView 的内容。
3. 在 RecyclerView 的 Adapter 类中,判断当前的 position 是否为头部或尾部,如果是,则在 `onCreateViewHolder()` 方法中设置对应的圆角布局。
以下是示例代码:
```java
public class MyItemDecoration extends RecyclerView.ItemDecoration {
private int radius; // 圆角半径
private int padding; // 矩形偏移量
public MyItemDecoration(int radius, int padding) {
this.radius = radius;
this.padding = padding;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
if (parent.getChildAdapterPosition(view) == 0) { // 头部
outRect.top = padding;
} else if (parent.getChildAdapterPosition(view) == parent.getAdapter().getItemCount() - 1) { // 尾部
outRect.bottom = padding;
}
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int left = child.getLeft() + params.leftMargin;
int right = child.getRight() - params.rightMargin;
int top = child.getTop() + params.topMargin;
int bottom = child.getBottom() - params.bottomMargin;
if (parent.getChildAdapterPosition(child) == 0) { // 头部
drawRoundRect(c, left, top, right, bottom + padding, radius, true, true, false, false);
} else if (parent.getChildAdapterPosition(child) == parent.getAdapter().getItemCount() - 1) { // 尾部
drawRoundRect(c, left, top - padding, right, bottom, radius, false, false, true, true);
}
}
}
// 绘制圆角矩形
private void drawRoundRect(Canvas canvas, float left, float top, float right, float bottom,
float radius, boolean tl, boolean tr, boolean bl, boolean br) {
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.FILL);
Path path = new Path();
float[] radii = new float[8];
if (tl) {
radii[0] = radius;
radii[1] = radius;
}
if (tr) {
radii[2] = radius;
radii[3] = radius;
}
if (br) {
radii[4] = radius;
radii[5] = radius;
}
if (bl) {
radii[6] = radius;
radii[7] = radius;
}
path.addRoundRect(new RectF(left, top, right, bottom), radii, Path.Direction.CW);
canvas.drawPath(path, paint);
}
}
```
然后,在 RecyclerView 的 Adapter 中,可以根据 position 判断是否为头部或尾部,并设置对应的布局:
```java
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_HEADER) { // 头部
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_header, parent, false);
return new HeaderViewHolder(view);
} else if (viewType == TYPE_FOOTER) { // 尾部
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_footer, parent, false);
return new FooterViewHolder(view);
} else { // 正常的 Item
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_normal, parent, false);
return new NormalViewHolder(view);
}
}
```