RecyclerView中绘制不相同的分割线

博客内容介绍了如何在RecyclerView中绘制不相同的分割线,包括水平线和垂直线。通过自定义drawable资源和使用TypedArray,可以实现不同列表或列表内不同风格的分割线,而不仅仅是修改系统的listDivider。
摘要由CSDN通过智能技术生成

在绘制RecyclerView的分割线时我们通常是设置系统属性的android:listDivider为自定义的样式,然后再通过TypedArray获取一个drawable对象,通过回执drawable对象来绘制分割线。例如:

package com.example.admin.bannerstudy.custom;

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

/**
 * 适用于RecyclerView.setLayoutManager(new GridLayoutManager());
 *
 * 主要是测试怎么画分割线,没有考虑最后一行和最后一列不要画线的情况
 *
 */
public class GridItemDecorationExample extends RecyclerView.ItemDecoration {

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

    public static final int HORIZONTAL_LIST = LinearLayout.HORIZONTAL;
    public static final int VERICAL_LIST = LinearLayout.VERTICAL;

    private Drawable mDivider;
    private int mOrientation = VERICAL_LIST;

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

    public GridItemDecorationExample(Context context, int orientation) {
        this(context);
        setOrientation(orientation);
    }

    public void setOrientation(int orientation) {
        if(orientation != HORIZONTAL_LIST && orientation != VERICAL_LIST) {
            throw new IllegalArgumentException("invalid orientation");
        }
        mOrientation = orientation;
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        drawVertical(c, parent);
        drawHorizental(c, parent);
    }

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

    // 绘制水平线,drawVertical表示每条线是垂直分布的
    public void drawVertical(Canvas c, RecyclerView parent) {
        final int left = parent.getPaddingLeft();
        final int right = parent.getWidth() - parent.getPaddingRight();

        final int childCount  = parent.getChildCount();

        if(mOrientation == VERICAL_LIST) {  // 当设置列表垂直排布时
            // 获取列表的总行数
            int rows = (int)Math.ceil(((double)childCount / (double)getSpanCount(parent)));
            for(int i = 0; i < rows; i++) {
                // 取到每行的第一个childView
                View childView = parent.getChildAt(i * getSpanCount(parent));
                final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) childView.getLayoutParams();
                int top = childView.getBottom() + params.bottomMargin;
                int bottom = top + mDivider.getIntrinsicHeight();
                mDivider.setBounds(left, top, right, bottom);
                mDivider.draw(c);
            }
        } else if(mOrientation == HORIZONTAL_LIST) {    // 但设置列表水平排布时
            // 获取列表的总行数
            int rows = getSpanCount(parent) >= childCount ? childCount : getSpanCount(parent);
            for(int i = 0; i < rows; i++) {
                // 取到每行的第一个childView
                View childView = parent.getChildAt(i);
                final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) childView.getLayoutParams();
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值