RecyclerView系列 - ListView样式分割线封装

1. 说明


基于我们上节课讲解的给RecyclerView设置分割线的方法后,我相信大家已经对如何给RecyclerView添加分割线已经有了自己的思考,和想法,其实很简单,就是给每个item留出位置,然后用画笔来画分割线,在正式开发项目过程中,有时候分割线很简单,就是一条线,有时候可能会是一张图片,所以在这边为了可扩展性好,我们画分割线实际上还是画的是Drawable,这样的话:
如果分割线是画一条线,我们就直接在在drawable下边画shape形状为矩形,高度为1dp的就行;
如果分割线是画一张图片,我们就直接在drawable下边引用一张图片就行;

2. ListView分割线的封装


具体实现:
2.1 自定义LinearLayoutItemDecoration继承自RecyclerView.ItemDecoration然后重写构造方法、getItemOffsets()和onDraw()方法
2.2 具体方法含义:
构造方法传递参数:
context,资源id
getItemOffsets():
给item的顶部留出位置,用onDraw()来画分割线,注意不要给第0个位置的item的上边来画分割线,从第一个item的位置开始画分割线;
onDraw():
画分割线

自定义LinearLayoutItemDecoration具体代码如下:

/**
 * Created by JackChen on 2018/3/3.
 * ListView样式的分割线
 */
public class LinearLayoutItemDecoration extends RecyclerView.ItemDecoration {

    private Drawable mDriver ;

    // 网上绝大部分用的系统的一个属性 叫做 android.R.attrs.listDriver ,这个也可以,需要在清单文件中配置
    public LinearLayoutItemDecoration(Context context , int drawableRescourseId){
        // 解析获取 Drawable
        mDriver = ContextCompat.getDrawable(context , drawableRescourseId) ;
    }


    // 在这里 就把RecyclerView.ItemDecoration的2个方法同样拷贝进来

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        // 代表在每个item底部的位置留出10px 来绘制分割线 , 效果可以实现,问题是最后一个item还有分割线

        int position = parent.getChildAdapterPosition(view);

        // 代表你要在哪个位置上边留出位置来
        // 留出头部位置 ,不为第0个位置的item留出位置,即就是从第一个item开始给上边留出的位置
        if (position != 0){
            outRect.top = mDriver.getIntrinsicHeight() ;  //表示 mDrawable有多高,就在头部留出多高
        }
    }




    // 绘制分割线
    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        // 利用canvas想绘制什么就绘制什么
        // 在每一个item的头部来绘制
        int childCount = parent.getChildCount() ;


        // 指定绘制的区域
        Rect rect = new Rect() ;
        rect.left = parent.getPaddingLeft() ;
        rect.right = parent.getWidth() - parent.getPaddingRight() ;
        // 头部第一个不需要绘制分割线,所以直接从第二个开始
        for (int i = 1; i < childCount; i++) {
            // 分割线的底部就是 item的头部
            rect.bottom = parent.getChildAt(i).getTop() ;
            rect.top = rect.bottom - mDriver.getIntrinsicHeight() ;
            mDriver.setBounds(rect);
            mDriver.draw(c);
        }
    }
}

2.3 最后直接在recycler_view的setAdapter下边直接调用recycler_view.addItemDecoration(new LinearLayout(this , R.drawable.item_divider_01)) ;

注意:
如果分割线是一条线,直接在item_divider_01中:





    
    
    
    

    
    


如果分割线是一张图片的话,就直接把item_divider_01换成1张图片就行

ok,ListView样式分割线就是这样,怎么样,很简单吧,步骤就是四步:
第一步:自定义LinearLayoutItemDecoration继承RecyclerView.ItemDecoration,然后复写构造方法和2个方法,分别是getItemOffsets()和onDraw();
第二步:在getItemOffsets()方法是在每个item顶部留出位置;
第三步:在onDraw()方法中画分割线;
第四步:最后在recycler_view.setAdapter中直接调用recycler_view.addItemDecoration(new LinearLayoutItemDecoration( this , R.drawable.item_divider_01)) ; 即可;

这个就是ListView分割线的封装,那么下节课我们就来一起实现下GridView样式分割线的封装

你可能感兴趣的:(RecyclerView系列 - ListView样式分割线封装)