RecyclerView的自定义万能分割线

最近项目多次用到了RecyclerView,有时候是LinearLayoutManager, 有时候是GridLayoutManager, 或者StraggeredGridLayoutMananger,在定制分割线的时候,最初是一种layoutManager,或者一种分割线样式就给写个类,后面有时间才整理出,适用于各种layoutManager,和各种样式分割线 的万能分割线。


代码如下:


package com.XXX.XXX.mubanapplication.ui.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;

import com.example.xxx.mubanapplication.help_class.ContextHelper;

/**
 * Created by XXXX on 2017/4/19.
 */

public class DividerGridItemDecoration extends RecyclerView.ItemDecoration {

    private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
    private Drawable mDivider;
    private int size;
    private Paint mPaint;

    /**
     * 默认分割线:高度为2px,颜色为灰色
     *
     * @param context
     */
    public DividerGridItemDecoration(Context context) {
        if (mDivider == null) {
            final TypedArray a = context.obtainStyledAttributes(ATTRS);
            mDivider = a.getDrawable(0);
            a.recycle();
        }
    }

    public DividerGridItemDecoration(Context context, int drawableId) {
        mDivider = ContextHelper.getDrawable(drawableId);
        size = mDivider.getIntrinsicHeight();//根据朝向,获取宽或者高
    }

    public DividerGridItemDecoration(Context context, int drawableId, int dividerColor) {
        mDivider = ContextHelper.getDrawable(drawableId);
        size = mDivider.getIntrinsicHeight();//根据朝向,获取宽或者高
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(ContextHelper.getColor(dividerColor));
        mPaint.setStyle(Paint.Style.FILL);
    }

    /*
    * @param size:The width or height of divider
    * */
    public void setSize(int value) {
        size = value;
    }

    public void setOrientation(int value) {
        size = value;
    }


    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
        if (layoutManager instanceof GridLayoutManager || layoutManager instanceof StaggeredGridLayoutManager) {
            drawHorizontal(c, parent);
            drawVertical(c, parent);
        } else {
            drawHorizontal(c, parent);
        }
    }

    private int getSpanCount(RecyclerView parent) {
        // 列数
        int spanCount = -1;
        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
        if (layoutManager instanceof GridLayoutManager) {

            spanCount = ((GridLayoutManager) layoutManager).getSpanCount();
        } else if (layoutManager instanceof StaggeredGridLayoutManager) {
            spanCount = ((StaggeredGridLayoutManager) layoutManager)
                    .getSpanCount();
        }
        return spanCount;
    }

    //画水平线
    public void drawHorizontal(Canvas c, RecyclerView parent) {
        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = parent.getChildAt(i);
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            final int left = child.getLeft() - params.leftMargin;
            final int right = child.getRight() + params.rightMargin + size;
            final int top = child.getBottom() + params.bottomMargin;
            final int bottom = top + size;

            if (mDivider != null) {
                mDivider.setBounds(left, top, right, bottom);
                mDivider.draw(c);
            }
            if (mPaint != null) {
                c.drawRect(left, top, right, bottom, mPaint);
            }
        }
    }


    //画竖线
    public void drawVertical(Canvas c, RecyclerView parent) {
        final int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = parent.getChildAt(i);

            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            final int top = child.getTop() - params.topMargin;
            final int bottom = child.getBottom() + params.bottomMargin;
            final int left = child.getRight() + params.rightMargin;
            final int right = left + size;


            if (mDivider != null) {
                mDivider.setBounds(left, top, right, bottom);
                mDivider.draw(c);
            }
            if (mPaint != null) {
                c.drawRect(left, top, right, bottom, mPaint);
            }
        }
    }

    private boolean isLastColum(RecyclerView parent, int pos, int spanCount,
                                int childCount) {
        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
        if (layoutManager instanceof GridLayoutManager) {
            if ((pos + 1) % spanCount == 0) {// 如果是最后一列,则不需要绘制右边
                return true;
            }
        } else if (layoutManager instanceof StaggeredGridLayoutManager) {
            int orientation = ((StaggeredGridLayoutManager) layoutManager)
                    .getOrientation();
            if (orientation == StaggeredGridLayoutManager.VERTICAL) {
                if ((pos + 1) % spanCount == 0) {// 如果是最后一列,则不需要绘制右边
                    return true;
                }
            } else {
                childCount = childCount - childCount % spanCount;
                if (pos >= childCount)// 如果是最后一列,则不需要绘制右边
                    return true;
            }
        }
        return false;
    }

    private boolean isLastRaw(RecyclerView parent, int pos, int spanCount,
                              int childCount) {
        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
        if (layoutManager instanceof GridLayoutManager) {
//            childCount = childCount - childCount % spanCount;
            if (pos >= childCount - spanCount)// 如果是最后一行,则不需要绘制底部
                return true;
        } else if (layoutManager instanceof StaggeredGridLayoutManager) {
            int orientation = ((StaggeredGridLayoutManager) layoutManager)
                    .getOrientation();
            // StaggeredGridLayoutManager 且纵向滚动
            if (orientation == StaggeredGridLayoutManager.VERTICAL) {
                childCount = childCount - childCount % spanCount;
                // 如果是最后一行,则不需要绘制底部
                if (pos >= childCount - spanCount)// 如果是最后一行,则不需要绘制底部
                    return true;
            } else {// StaggeredGridLayoutManager 且横向滚动

                // 如果是最后一行,则不需要绘制底部
                if ((pos + 1) % spanCount == 0) {
                    return true;
                }
            }
        } else {
            if (pos == childCount - 1) {
                return true;
            }
        }
        return false;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        int spanCount = getSpanCount(parent);
        int childCount = parent.getAdapter().getItemCount();
        int itemPosition = parent.getChildAdapterPosition(view);
        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
        if (layoutManager instanceof GridLayoutManager || layoutManager instanceof StaggeredGridLayoutManager) {
            if (isLastRaw(parent, itemPosition, spanCount, childCount)) {// 如果是最后一行,则不需要绘制底部
                if (isLastColum(parent, itemPosition, spanCount, childCount)) {//最后一个
                    outRect.set(0, 0, 0, 0);
                } else {
                    outRect.set(0, 0, size, 0);
                }

            } else if (isLastColum(parent, itemPosition, spanCount, childCount)) {// 如果是最后一列,则不需要绘制右边
                outRect.set(0, 0, 0, size);
            } else {
                outRect.set(0, 0, size, size);
            }
        } else {
            if (isLastRaw(parent, itemPosition, spanCount, childCount)) {// 如果是最后一行,则不需要绘制右边
                outRect.set(0, 0, 0, 0);
            } else {
                outRect.set(0, 0, 0, size);
            }
        }
    }
}


Activity的XML代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.haoyuban111.mubanapplication.ui.activity.ActivityFirst">

    <include layout="@layout/layout_header" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginTop="11dp"
        android:layout_marginLeft="11dp"
        android:layout_marginRight="11dp"
        android:layout_marginBottom="11dp"
        android:layout_weight="1" />
    

    <include
        android:id="@+id/viewBottom"
        layout="@layout/layout_bottom" />


</LinearLayout>

Activity中代码:

   recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        GridLayoutManager layoutManager = new GridLayoutManager(ContextHelper.getApplicationContext(), 2);
        DividerGridItemDecoration decoration = new DividerGridItemDecoration(ContextHelper.getApplicationContext(), R.drawable.divider, R.color.yellow);
        decoration.setSize(20);
        recyclerView.addItemDecoration(decoration);
        recyclerView.setLayoutManager(layoutManager);

divider.xml代码:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@color/blue" />
    <size android:height="10dp" />
</shape>

ContextHelper中几个方法,也贴上吧

public static int getColor(int id) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            return ContextHelper.getApplicationContext().getResources().getColor(id, getApplicationContext().getTheme());
        } else {
            return ContextHelper.getApplicationContext().getResources().getColor(id);
        }
    }

    public static String getString(int id) {
        return getApplicationContext().getString(id);
    }


    public static Drawable getDrawable(int drawableId) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            return ContextHelper.getApplicationContext().getResources().getDrawable(drawableId, getApplicationContext().getTheme());
        } else {
            return ContextHelper.getApplicationContext().getResources().getDrawable(drawableId);
        }
    }




效果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值