天天看點

RecyclerView添加分割線

RecyclerView添加分割線

線性布局

public class CommonDecoration extends RecyclerView.ItemDecoration {

    //清單的方向:LinearLayoutManager.VERTICAL或LinearLayoutManager.HORIZONTAL
    private int mOrientation;
    private int padding;

    /**
     * 預設分割線:高度為2px,顔色為灰色
     *
     * @param context
     * @param orientation 清單方向
     */
    public CommonDecoration(Context context, int orientation, int dp) {
        if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) {
            throw new IllegalArgumentException("請輸入正确的參數!");
        }
        mOrientation = orientation;
        padding = DensityUtils.dp2px(dp);

    }

    @Override
    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        int itemCount = parent.getAdapter().getItemCount();
        int childAdapterPosition = parent.getChildAdapterPosition(view);
        if (mOrientation == LinearLayoutManager.HORIZONTAL) {
            if (childAdapterPosition < itemCount - 1) {
                outRect.set(0, 0, padding, 0);
            } else {
                outRect.set(0, 0, 0, 0);
            }
        } else {
            if (childAdapterPosition < itemCount - 1) {
                outRect.set(0, 0, 0, padding);
            } else {
                outRect.set(0, 0, 0, 0);
            }
        }

    }

}
           

網格布局

public class GridDecoration extends RecyclerView.ItemDecoration {

    private int horizontalPadding;
    public int verticalPadding;

    public GridDecoration(int horizontalPadding, int verticalPadding) {
        this.horizontalPadding = DensityUtils.dp2px(horizontalPadding);
        this.verticalPadding = DensityUtils.dp2px(verticalPadding);
    }

    @Override
    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
        if (layoutManager instanceof GridLayoutManager) {
            GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
            int spanCount = gridLayoutManager.getSpanCount();
            int childAdapterPosition = parent.getChildAdapterPosition(view);
            int column = childAdapterPosition % spanCount;
            int itemCount = parent.getAdapter().getItemCount();
            outRect.left = column * horizontalPadding / spanCount;
            outRect.right = horizontalPadding - (column + 1) * horizontalPadding / spanCount;
            //數學思想
            int raw = (itemCount-1) / spanCount;
            int currentRaw = childAdapterPosition / spanCount;
            if (raw != currentRaw) {
                outRect.bottom = verticalPadding;
            }else{
                outRect.bottom = 0;
            }
        }

    }

}