RecyclerView的萬(wàn)能分割線

參考地址:http://blog.csdn.net/pengkv/article/details/50538121
文章中有兩個(gè)錯(cuò)誤:
1:代碼中繪制橫向分割線和縱向分割線弄反 了

M0@`4JKBSQB8_FF1NS@(HKG.png

2:顏色設(shè)置無(wú)效:
解決:加載的顏色值設(shè)置無(wú)效,這樣設(shè)置就好了

%S5VXHS2%0$38X0EYBS_R_G.png

附代碼:

public class RecycleViewDivider extends RecyclerView.ItemDecoration {
    private Paint mPaint;
    private Drawable mDivider;
    private int mDividerHeight = 2;//分割線高度,默認(rèn)為1px
    private int mOrientation;//列表的方向:LinearLayoutManager.VERTICAL或LinearLayoutManager.HORIZONTAL
    private static final int[] ATTRS = new int[]{android.R.attr.listDivider};

    /**
     * 默認(rèn)分割線:高度為2px,顏色為灰色
     *
     * @param context
     * @param orientation 列表方向
     */
    public RecycleViewDivider(Context context, int orientation) {
        if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) {
            throw new IllegalArgumentException("請(qǐng)輸入正確的參數(shù)!");
        }
        mOrientation = orientation;

        final TypedArray a = context.obtainStyledAttributes(ATTRS);
        mDivider = a.getDrawable(0);
        a.recycle();
    }

    /**
     * 自定義分割線
     *
     * @param context
     * @param orientation 列表方向
     * @param drawableId  分割線圖片
     */
    public RecycleViewDivider(Context context, int orientation, int drawableId) {
        this(context, orientation);
        mDivider = ContextCompat.getDrawable(context, drawableId);
        mDividerHeight = mDivider.getIntrinsicHeight();
    }

    /**
     * 自定義分割線
     *
     * @param context
     * @param orientation   列表方向
     * @param dividerHeight 分割線高度
     * @param dividerColor  分割線顏色
     */
    public RecycleViewDivider(Context context, int orientation, int dividerHeight, int dividerColor) {
        this(context, orientation);
        mDividerHeight = dividerHeight;
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
//        mPaint.setColor(dividerColor);    //這樣設(shè)置無(wú)效
        mPaint.setColor(Color.parseColor("#FFF3F4F6"));
        mPaint.setStyle(Paint.Style.FILL);
        LogUtil.d("分割線顏色:"+mPaint.getColor());
    }


    //獲取分割線尺寸
    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        outRect.set(0, 0, 0, mDividerHeight);
    }

    //繪制分割線
    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDraw(c, parent, state);
        if (mOrientation == LinearLayoutManager.VERTICAL) {
//            drawVertical(c, parent);
            drawHorizontal(c, parent);
        } else {
//            drawHorizontal(c, parent);
            drawVertical(c, parent);
        }
    }

    //繪制橫向 item 分割線
    private void drawHorizontal(Canvas canvas, RecyclerView parent) {
        final int left = parent.getPaddingLeft();
        final int right = parent.getMeasuredWidth() - parent.getPaddingRight();
        final int childSize = parent.getChildCount();
        for (int i = 0; i < childSize; i++) {
            final View child = parent.getChildAt(i);
            RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
            final int top = child.getBottom() + layoutParams.bottomMargin;
            final int bottom = top + mDividerHeight;
            if (mDivider != null) {
                mDivider.setBounds(left, top, right, bottom);
                mDivider.draw(canvas);
            }
            if (mPaint != null) {
                canvas.drawRect(left, top, right, bottom, mPaint);
            }
        }
    }

    //繪制縱向 item 分割線
    private void drawVertical(Canvas canvas, RecyclerView parent) {
        final int top = parent.getPaddingTop();
        final int bottom = parent.getMeasuredHeight() - parent.getPaddingBottom();
        final int childSize = parent.getChildCount();
        for (int i = 0; i < childSize; i++) {
            final View child = parent.getChildAt(i);
            RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
            final int left = child.getRight() + layoutParams.rightMargin;
            final int right = left + mDividerHeight;
            if (mDivider != null) {
                mDivider.setBounds(left, top, right, bottom);
                mDivider.draw(canvas);
            }
            if (mPaint != null) {
                canvas.drawRect(left, top, right, bottom, mPaint);
            }
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,845評(píng)論 25 708
  • 在此特此聲明:一下所有鏈接均來(lái)自互聯(lián)網(wǎng),在此記錄下我的查閱學(xué)習(xí)歷程,感謝各位原創(chuàng)作者的無(wú)私奉獻(xiàn) ! 技術(shù)一點(diǎn)一點(diǎn)積...
    遠(yuǎn)航的移動(dòng)開發(fā)歷程閱讀 11,188評(píng)論 12 197
  • 他的財(cái)富足夠他生活好幾個(gè)世紀(jì),可是他從不錦衣華服,沒有豪宅,也不開跑車。在群星閃耀的好萊塢里,他不一定最?yuàn)Z目,但他...
    08c3cdfa437c閱讀 1,588評(píng)論 1 2
  • 繽繽和老丁,是我的兩個(gè)朋友。 也就在前幾天,他倆 戀愛了。 我聽說(shuō)之后,第一反應(yīng)不是興高采烈跑去賀辭祝...
    蹙損她寥寥春山閱讀 1,679評(píng)論 6 19
  • 第一天來(lái)。 記錄下自己薄薄的青春和當(dāng)下來(lái)日的一點(diǎn)領(lǐng)悟。 本想兩句草草結(jié)束,但是近日正在經(jīng)歷的一些人生變化,讓我上班...
    尼比努反反閱讀 285評(píng)論 0 1