/** * @time: 2019/2/28 0028 下午 16:35 * @author:lst * @Description: 分割线 自定义 颜色,位置 */ public class LinearDividerItemDecoration extends RecyclerView.ItemDecoration { private static final int[] ATTRS = new int[]{ android.R.attr.listDivider }; public static final int LINEAR_DIVIDER_HORIZONTAL = LinearLayoutManager.HORIZONTAL; public static final int LINEAR_DIVIDER_VERTICAL = LinearLayoutManager.VERTICAL; private final SparseIntArray mDividerOffsets = new SparseIntArray(); private final SparseArray<DrawableCreator> mTypeDrawableFactories = new SparseArray<>(); @IntDef({ LINEAR_DIVIDER_HORIZONTAL, LINEAR_DIVIDER_VERTICAL }) @Retention(RetentionPolicy.SOURCE) private @interface Orientation { } @Orientation private int mOrientation; private Drawable mDivider; private boolean top = false; public LinearDividerItemDecoration(@Orientation int orientation, Drawable mDivider, boolean top) { this.mDivider = mDivider; setOrientation(orientation); this.top = top; } public LinearDividerItemDecoration(@Orientation int orientation, Drawable mDivider) { this.mDivider = mDivider; setOrientation(orientation); } public void setOrientation(@Orientation int orientation) { mOrientation = orientation; } public void setDivider(Drawable divider) { this.mDivider = divider; } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { if (mOrientation == LINEAR_DIVIDER_VERTICAL) { drawVerticalDividers(c, parent); } else { drawHorizontalDividers(c, parent); } } public void drawVerticalDividers(Canvas c, RecyclerView parent) { final int left = parent.getPaddingLeft(); final int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); if (this.top) { for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final Drawable divider = getDivider(parent, params.getViewAdapterPosition()); final int bottom = child.getTop() - params.topMargin - Math.round(child.getTranslationY()); final int top = bottom - divider.getIntrinsicHeight(); mDividerOffsets.put(params.getViewAdapterPosition(), divider.getIntrinsicHeight()); divider.setBounds(left, top, right, bottom); divider.draw(c); } }else { for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final Drawable divider = getDivider(parent, params.getViewAdapterPosition()); final int top = child.getBottom() + params.bottomMargin + Math.round(child.getTranslationY()); final int bottom = top + divider.getIntrinsicHeight(); mDividerOffsets.put(params.getViewAdapterPosition(), divider.getIntrinsicHeight()); divider.setBounds(left, top, right, bottom); divider.draw(c); } } } public void drawHorizontalDividers(Canvas c, RecyclerView parent) { final int top = parent.getPaddingTop(); final int bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); if (this.top) { // 左边 for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final Drawable divider = getDivider(parent, params.getViewAdapterPosition()); final int right = child.getLeft() - params.leftMargin - Math.round(child.getTranslationX()); final int left = right - divider.getIntrinsicHeight(); mDividerOffsets.put(params.getViewAdapterPosition(), divider.getIntrinsicHeight()); divider.setBounds(left, top, right, bottom); divider.draw(c); } } else { for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final Drawable divider = getDivider(parent, params.getViewAdapterPosition()); final int left = child.getRight() + params.rightMargin + Math.round(child.getTranslationX()); final int right = left + divider.getIntrinsicHeight(); mDividerOffsets.put(params.getViewAdapterPosition(), divider.getIntrinsicHeight()); divider.setBounds(left, top, right, bottom); divider.draw(c); } } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { final int adapterPosition = parent.getChildAdapterPosition(view); if (top) { if (mDividerOffsets.indexOfKey(adapterPosition) < 0) { mDividerOffsets.put(adapterPosition, getDivider(parent, adapterPosition).getIntrinsicHeight()); } if (mOrientation == LINEAR_DIVIDER_VERTICAL) { outRect.set(0, mDividerOffsets.get(parent.getChildAdapterPosition(view)), 0, 0); } else { outRect.set(mDividerOffsets.get(parent.getChildAdapterPosition(view)), 0, 0, 0); } } else { if (adapterPosition == parent.getAdapter().getItemCount() - 1) { return; } if (mDividerOffsets.indexOfKey(adapterPosition) < 0) { mDividerOffsets.put(adapterPosition, getDivider(parent, adapterPosition).getIntrinsicHeight()); } if (mOrientation == LINEAR_DIVIDER_VERTICAL) { outRect.set(0, 0, 0, mDividerOffsets.get(parent.getChildAdapterPosition(view))); } else { outRect.set(0, 0, mDividerOffsets.get(parent.getChildAdapterPosition(view)), 0); } } } private Drawable getDivider(RecyclerView parent, int adapterPosition) { final RecyclerView.Adapter adapter = parent.getAdapter(); final int itemType = adapter.getItemViewType(adapterPosition); final DrawableCreator drawableCreator = mTypeDrawableFactories.get(itemType); if (drawableCreator != null) { return drawableCreator.create(parent, adapterPosition); } return mDivider; } public void registerTypeDrawable(int itemType, DrawableCreator drawableCreator) { mTypeDrawableFactories.put(itemType, drawableCreator); } public interface DrawableCreator { Drawable create(RecyclerView parent, int adapterPosition); } }
附上详细解析