RecyclerView的分割线

RecyclerView是增强版的ListView,可以很容易实现侧滑删除和拖拽功能。但是RecyclerView得Item之间的分割线设置却没有ListView那么简单。

ListView分割线设置如下:

   <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@drawable/item_divider"
        android:dividerHeight="10dp"/>
RecyclerView没有提供divider和dividerHeight两个属性。只提供了RecyclerView.ItemDecoration这个内部类,我们要自定义一个类继承此类。实现RecyclerView的分割线。

自定义的ItemDivider

package com.wowsai.www.progresswebview;

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

/**
 * Created by Administrator on 2017/1/18.
 */
public class MyItemDivider extends RecyclerView.ItemDecoration {
    //画笔,用来绘制分割线
    private Paint paint;
    private Context context;
    //recyclerView的布局方向:水平或者垂直
    private int orientation;
    //分割线的高度
    private int dividerHeight;
    //分割线可以是drawable对象
    private Drawable divider;

    public MyItemDivider(Context context, int orientation) {
        //如果方向不是水平或垂直的,抛出异常
        if (orientation != LinearLayout.VERTICAL && orientation != LinearLayout.HORIZONTAL) {
            throw new IllegalArgumentException("the layoutManager of RecyclerView must be " +
                    "LinearLayoutManager");
        }
        this.context = context;
        this.orientation = orientation;
    }

    //自定义分割线的高度和颜色
    public MyItemDivider(Context context, int orientation, int dividerHeight, int dividerColor) {
        this(context, orientation);
        this.dividerHeight = dividerHeight;
        initPaint(dividerColor);
    }

    //自定义drawable分割线
    public MyItemDivider(Context context, int orientation, Drawable divider) {
        this(context, orientation);
        this.divider = divider;
    }

    private void initPaint(int dividerColor) {
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(dividerColor);
        paint.setStyle(Paint.Style.FILL);
    }

    //获得Item的偏移量
    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State
            state) {
        super.getItemOffsets(outRect, view, parent, state);
        //水平布局,每个item向右偏移dividerHeight
        if (orientation == LinearLayout.HORIZONTAL) {
            outRect.set(0, 0, dividerHeight, 0);
        }
        //垂直布局,每个item向下偏移dividerHeight
        else if (orientation == LinearLayout.VERTICAL) {
            outRect.set(0, 0, 0, dividerHeight);
        }
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDraw(c, parent, state);
        if (orientation == LinearLayout.HORIZONTAL) {
            drawHorizontalDivider(c, parent);
        } else if (orientation == LinearLayout.VERTICAL) {
            drawVerticalDivider(c, parent);
        }
    }

    //根据方向和分割线高度算出分割线的位置,用画笔划出来
    private void drawHorizontalDivider(Canvas canvas, RecyclerView recyclerView) {
        int top = recyclerView.getPaddingTop();
        int bottom = recyclerView.getHeight() - recyclerView.getPaddingRight();
        int count = recyclerView.getChildCount();
        for (int i = 0; i < count; i++) {
            View child = recyclerView.getChildAt(i);
            RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            int left = child.getRight() + layoutParams.rightMargin;
            int right = left + dividerHeight;
            if (divider != null) {
                divider.setBounds(left, top, right, bottom);
                divider.draw(canvas);
            } else if (paint != null) {
                canvas.drawRect(left, top, right, bottom, paint);
            }
        }
    }

    private void drawVerticalDivider(Canvas canvas, RecyclerView recyclerView) {
        int left = recyclerView.getPaddingLeft();
        int right = recyclerView.getWidth() - recyclerView.getPaddingRight();
        int count = recyclerView.getChildCount();
        for (int i = 0; i < count; i++) {
            View child = recyclerView.getChildAt(i);
            RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            int top = child.getBottom() + layoutParams.bottomMargin;
            int bottom = top + dividerHeight;
            if (divider != null) {
                divider.setBounds(left, top, right, bottom);
                divider.draw(canvas);
            } else if (paint != null) {
                canvas.drawRect(left, top, right, bottom, paint);
            }
        }
    }
}
使用:

布局文件:

 <android.support.v7.widget.RecyclerView
       android:id="@+id/recyclerView"
       android:layout_width="match_parent"
       android:layout_height="match_parent"/>
activity代码:

package com.wowsai.www.progresswebview;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.LinearLayout;

import java.util.ArrayList;
import java.util.List;

public class Main5Activity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    //模拟数据
    private List<String> data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main5);
        initData();
        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        //设置布局管理器,必要操作
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayout
                .VERTICAL, false);
        mRecyclerView.setLayoutManager(linearLayoutManager);
        //设置自定义item分割线,高度15px,颜色灰色
        mRecyclerView.addItemDecoration(new MyItemDivider(this, LinearLayout.VERTICAL, 15, Color
                .GRAY));
        RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, data);
        mRecyclerView.setAdapter(adapter);

    }

    private void initData() {
        data = new ArrayList<>();
        for (int i = 0; i < 50; i++) {
            data.add("数据====" + i);
        }
    }
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值