Drawing a Separator
suggest changeThis will draw a line at the bottom of every view but the last to act as a separator between items.
public class SeparatorDecoration extends RecyclerView.ItemDecoration { private final Paint mPaint; private final int mAlpha; public SeparatorDecoration(@ColorInt int color, float width) { mPaint = new Paint(); mPaint.setColor(color); mPaint.setStrokeWidth(width); mAlpha = mPaint.getAlpha(); } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) view.getLayoutParams(); // we retrieve the position in the list final int position = params.getViewAdapterPosition(); // add space for the separator to the bottom of every view but the last one if (position < state.getItemCount()) { outRect.set(0, 0, 0, (int) mPaint.getStrokeWidth()); // left, top, right, bottom } else { outRect.setEmpty(); // 0, 0, 0, 0 } } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { // a line will draw half its size to top and bottom, // hence the offset to place it correctly final int offset = (int) (mPaint.getStrokeWidth() / 2); // this will iterate over every visible view for (int i = 0; i < parent.getChildCount(); i++) { final View view = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) view.getLayoutParams(); // get the position final int position = params.getViewAdapterPosition(); // and finally draw the separator if (position < state.getItemCount()) { // apply alpha to support animations mPaint.setAlpha((int) (view.getAlpha() * mAlpha)); float positionY = view.getBottom() + offset + view.getTranslationY(); // do the drawing c.drawLine(view.getLeft() + view.getTranslationX(), positionY, view.getRight() + view.getTranslationX(), positionY, mPaint); } } } }
Found a mistake? Have a question or improvement idea?
Let me know.
Table Of Contents