package com.example.widget; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.view.View; // source: https://gist.github.com/lapastillaroja/858caf1a82791b6c1a36 public class LinearDividerItemDecoration extends RecyclerView.ItemDecoration { private Drawable mDivider; private boolean mShowFirstDivider = false; private boolean mShowLastDivider = false; public LinearDividerItemDecoration(Context context, AttributeSet attrs) { final TypedArray a = context.obtainStyledAttributes(attrs, new int[]{android.R.attr.listDivider}); mDivider = a.getDrawable(0); a.recycle(); } public LinearDividerItemDecoration(Context context, AttributeSet attrs, boolean showFirstDivider, boolean showLastDivider) { this(context, attrs); mShowFirstDivider = showFirstDivider; mShowLastDivider = showLastDivider; } public LinearDividerItemDecoration(Drawable divider) { mDivider = divider; } public LinearDividerItemDecoration(Drawable divider, boolean showFirstDivider, boolean showLastDivider) { this(divider); mShowFirstDivider = showFirstDivider; mShowLastDivider = showLastDivider; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView recyclerView, RecyclerView.State state) { super.getItemOffsets(outRect, view, recyclerView, state); if(mDivider == null) { return; } if(recyclerView.getChildLayoutPosition(view) < 1) { return; } if(getOrientation(recyclerView) == LinearLayoutManager.VERTICAL) { outRect.top = mDivider.getIntrinsicHeight(); } else { outRect.left = mDivider.getIntrinsicWidth(); } } @Override public void onDrawOver(Canvas canvas, RecyclerView recyclerView, RecyclerView.State state) { if(mDivider == null) { super.onDrawOver(canvas, recyclerView, state); return; } // initialization int left = 0, right = 0, top = 0, bottom = 0, size; int orientation = getOrientation(recyclerView); int childCount = recyclerView.getChildCount(); if(orientation == LinearLayoutManager.VERTICAL) { size = mDivider.getIntrinsicHeight(); left = recyclerView.getPaddingLeft(); right = recyclerView.getWidth() - recyclerView.getPaddingRight(); } else { size = mDivider.getIntrinsicWidth(); top = recyclerView.getPaddingTop(); bottom = recyclerView.getHeight() - recyclerView.getPaddingBottom(); } for(int i = mShowFirstDivider ? 0 : 1; i < childCount; i++) { View child = recyclerView.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); if(orientation == LinearLayoutManager.VERTICAL) { top = child.getTop() - params.topMargin - size; bottom = top + size; } else { left = child.getLeft() - params.leftMargin - size; right = left + size; } mDivider.setBounds(left, top, right, bottom); mDivider.draw(canvas); } // show last divider if(mShowLastDivider && childCount > 0) { View child = recyclerView.getChildAt(childCount - 1); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); if(orientation == LinearLayoutManager.VERTICAL) { top = child.getBottom() + params.bottomMargin; bottom = top + size; } else { left = child.getRight() + params.rightMargin; right = left + size; } mDivider.setBounds(left, top, right, bottom); mDivider.draw(canvas); } } private int getOrientation(RecyclerView recyclerView) { if(recyclerView.getLayoutManager() instanceof LinearLayoutManager) { LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); return linearLayoutManager.getOrientation(); } else { throw new IllegalStateException(this.getClass().getSimpleName() + " can only be used with a " + LinearLayoutManager.class.getSimpleName()); } } }