美文网首页
RecyclerView的divider

RecyclerView的divider

作者: 43d60efa37c7 | 来源:发表于2016-11-30 14:43 被阅读101次

    LinearLayoutManager情况

    public class DividerItemDecoration extends RecyclerView.ItemDecoration {

    private static final int[] ATTRS = new int[] { android.R.attr.listDivider };

    public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;

    public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;

    private Drawable mDivider;

    private int mOrientation;

    public DividerItemDecoration(Context context, int orientation) {

    final TypedArray a = context.obtainStyledAttributes(ATTRS);

    mDivider = a.getDrawable(0);

    a.recycle();

    setOrientation(orientation);

    }

    /**

    *只需要传入一个drawable的id和方向,就可以作为divider

    * @param context

    * @param orientation 方向

    * @param drawableId 分割线的drawableId

    */

    public DividerItemDecoration(Context context, int orientation,int drawableId){

    mDivider = context.getResources().getDrawable(drawableId);

    setOrientation(orientation);

    }

    public void setOrientation(int orientation) {

    if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {

    throw new IllegalArgumentException("invalid orientation");

    }

    mOrientation = orientation;

    }

    @Override

    public void onDraw(Canvas c, RecyclerView parent) {

    Log.v("recyclerview - itemdecoration", "onDraw()");

    if (mOrientation == VERTICAL_LIST) {

    drawVertical(c, parent);

    } else {

    drawHorizontal(c, parent);

    }

    }

    public void drawVertical(Canvas c, RecyclerView parent) {

    final int left = parent.getPaddingLeft();

    final int right = parent.getWidth() - parent.getPaddingRight();

    final int childCount = parent.getChildCount();

    for (int i = 0; i < childCount; i++) {

    final View child = parent.getChildAt(i);

    android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(

    parent.getContext());

    final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child

    .getLayoutParams();

    final int top = child.getBottom() + params.bottomMargin;

    final int bottom = top + mDivider.getIntrinsicHeight();

    mDivider.setBounds(left, top, right, bottom);

    mDivider.draw(c);

    }

    }

    public void drawHorizontal(Canvas c, RecyclerView parent) {

    final int top = parent.getPaddingTop();

    final int bottom = parent.getHeight() - parent.getPaddingBottom();

    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 left = child.getRight() + params.rightMargin;

    final int right = left + mDivider.getIntrinsicHeight();

    mDivider.setBounds(left, top, right, bottom);

    mDivider.draw(c);

    }

    }

    @Override

    public void getItemOffsets(Rect outRect, int itemPosition,

    RecyclerView parent) {

    if (mOrientation == VERTICAL_LIST) {

    outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());

    } else {

    outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);

    }

    }

    }

    GridLayoutManager清况

    public class DividerGridItemDecoration extends RecyclerView.ItemDecoration {

    //    private final int[] ATTRS = new int[] { android.R.attr.listDivider };

    private Drawable mDivider;

    //    private Paint paint;

    // private int mDividerSize = 100;

    public DividerGridItemDecoration(Context context,int drawableId)     {

    //        final TypedArray a = context.obtainStyledAttributes(ATTRS);

    //        mDivider = a.getDrawable(0);

    //        a.recycle();

    mDivider = context.getResources().getDrawable(drawableId);

    //        paint = new Paint(Paint.ANTI_ALIAS_FLAG);

    //        paint.setColor(Color.WHITE);

    }

    @Override

    public void onDraw(Canvas c, RecyclerView parent, State state)     {

    drawHorizontal(c, parent);

    drawVertical(c, parent);

    }

    private int getSpanCount(RecyclerView parent)     {

    // 列数

    int spanCount = -1;

    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

    + mDivider.getIntrinsicWidth();

    final int top = child.getBottom() + params.bottomMargin;

    final int bottom = top + mDivider.getIntrinsicHeight();

    mDivider.setBounds(left, top, right, bottom);

    mDivider.draw(c);

    }

    }

    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 + mDivider.getIntrinsicWidth();

    mDivider.setBounds(left, top, right, bottom);

    mDivider.draw(c);

    }

    }

    private boolean isLastColum(RecyclerView parent, int pos, int spanCount,

    int childCount)     {

    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)

    {

    LayoutManager layoutManager = parent.getLayoutManager();

    if (layoutManager instanceof GridLayoutManager)

    {

    childCount = childCount - childCount % spanCount;

    if (pos >= childCount)// 如果是最后一行,则不需要绘制底部

    return true;

    } else if (layoutManager instanceof StaggeredGridLayoutManager)

    {

    int orientation = ((StaggeredGridLayoutManager) layoutManager)

    .getOrientation();

    // StaggeredGridLayoutManager 且纵向滚动

    if (orientation == StaggeredGridLayoutManager.VERTICAL)

    {

    childCount = childCount - childCount % spanCount;

    // 如果是最后一行,则不需要绘制底部

    if (pos >= childCount)

    return true;

    } else

    // StaggeredGridLayoutManager 且横向滚动

    {

    // 如果是最后一行,则不需要绘制底部

    if ((pos + 1) % spanCount == 0)

    {

    return true;

    }

    }

    }

    return false;

    }

    @Override

    public void getItemOffsets(Rect outRect, int itemPosition,

    RecyclerView parent)

    {

    int spanCount = getSpanCount(parent);

    int childCount = parent.getAdapter().getItemCount();

    if (isLastRaw(parent, itemPosition, spanCount, childCount))// 如果是最后一行,则不需要绘制底部

    {

    outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);

    } else if (isLastColum(parent, itemPosition, spanCount, childCount))// 如果是最后一列,则不需要绘制右边

    {

    outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());

    } else

    {

    outRect.set(0, 0, mDivider.getIntrinsicWidth(),

    mDivider.getIntrinsicHeight());

    }

    }

    }

    相关文章

      网友评论

          本文标题:RecyclerView的divider

          本文链接:https://www.haomeiwen.com/subject/elltmttx.html