自定义recyclerview(listview) 的分割线

/**
 * @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);
    }
}

 

附上详细解析

https://blog.csdn.net/carson_ho/article/details/75004649

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值