本文共 4317 字,大约阅读时间需要 14 分钟。
因为没能找到直接的控件,给RecyclerView添加item间隔,及定义分隔条颜色,所以自定义RecyclerView分隔条,方便自定义分隔条颜色,item间隔,
package com.custom.views;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.drawable.ColorDrawable;import android.graphics.drawable.Drawable;import android.view.View;import androidx.annotation.NonNull;import androidx.recyclerview.widget.LinearLayoutManager;import androidx.recyclerview.widget.RecyclerView;public class RecyclerViewDivider extends RecyclerView.ItemDecoration{ private final Context mContext; private final int mOrientation;//item默认间隔宽度 private static final int DEFAULT_INTERVAL = 24; private static final int DEFAULT_DIVIDER_COLOR = Color.GRAY;//分隔条宽度 private final int mDividerPixel = 2; private final int mInterval; private final int mDividerColor; private final Paint mPaint; private final Drawable mDivider; public RecyclerViewDivider(Context context, int orientation) { this(context, orientation, DEFAULT_INTERVAL, DEFAULT_DIVIDER_COLOR); } public RecyclerViewDivider(Context context, int orientation, int interval) { this(context, orientation, interval, DEFAULT_DIVIDER_COLOR); } public RecyclerViewDivider(Context context, int orientation, int interval, int color) { if (orientation != LinearLayoutManager.HORIZONTAL && orientation != LinearLayoutManager.VERTICAL) { throw new IllegalArgumentException("orientation invalid."); } mContext = context; mOrientation = orientation; mInterval = interval; mDividerColor = color; mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setColor(mDividerColor); mPaint.setStyle(Paint.Style.FILL); mDivider = new ColorDrawable(Color.GRAY); } @Override public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); if (mOrientation == LinearLayoutManager.HORIZONTAL) { outRect.set(0, 0, mDividerPixel + DEFAULT_INTERVAL, 0); } else if (mOrientation == LinearLayoutManager.VERTICAL) { outRect.set(0, 0, 0, mDividerPixel + DEFAULT_INTERVAL); } } @Override public void onDraw(@NonNull Canvas canvas, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { super.onDraw(canvas, parent, state); if (mOrientation == LinearLayoutManager.HORIZONTAL) { drawVertical(canvas, parent); } else { drawHorizontal(canvas, parent); } } private void drawHorizontal(Canvas canvas, RecyclerView recyclerView) { final int left = recyclerView.getPaddingLeft(); final int right = recyclerView.getMeasuredWidth() - recyclerView.getPaddingLeft(); final int childSize = recyclerView.getChildCount(); for (int i = 0; i < childSize - 1; i++) { final View child = recyclerView.getChildAt(i); RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();//调整分隔条在间隔宽度中间 final int top = child.getBottom() + layoutParams.bottomMargin + DEFAULT_INTERVAL / 2; final int bottom = top + mDividerPixel; mDivider.setBounds(left, top, right, bottom); mDivider.draw(canvas); canvas.drawRect(left, top, right, bottom ,mPaint); } } private void drawVertical(Canvas canvas, RecyclerView recyclerView) { final int top = recyclerView.getPaddingTop(); final int bottom = recyclerView.getMeasuredHeight() - recyclerView.getPaddingBottom(); final int childSize = recyclerView.getChildCount(); for (int i = 0; i < childSize - 1; i++) { final View child = recyclerView.getChildAt(i); RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();//调整分隔条在间隔宽度中间 final int left = child.getRight() + layoutParams.rightMargin + DEFAULT_INTERVAL / 2; final int right = left + mDividerPixel; mDivider.setBounds(left, top, right, bottom); mDivider.draw(canvas); canvas.drawRect(left, top, right, bottom, mPaint); } }}
转载地址:http://qdeqz.baihongyu.com/