自定义控件Android技术自定义View

Recyclerview自定义分割线原理及实现

2019-06-13  本文已影响113人  努力不负青春

原理介绍

Recyclerview的每一个item项默认是充满父布局的。但是不美观,有时候我们需要加一点分割线让我们做出UI更加的有层次感,Recyclerview默认提供了一种分割线方法默认为1dp,在我们多变的需求下,明显不够用,所以我们需要去自定义一条。
//recycler 自带的分割线方法 recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.HORIZONTAL));
原理如下图,我们默认是充满整个父布局的。

17155811-3f487cb584c8236f.png
当我们需要设置分割线的时候,实际上就是对我们每一个Item的内容进行一定量的偏移,从而达到,我们想要的效果。
17155811-671edb2010f38289.png
原理讲完了,直接贴上代码,大家图文对照更容易理解。

代码实现

1.第一步,我们需要去继承Recyclerview.ItemDecoration。 并重写里面的方法。


image.png

2.第二步,在构造里面传入我们需要设置的分割线宽度和父布局View

     *
     * @param speac 设置的分割线宽度
     */
    public GridItem_Decoration(int speac,RecyclerView parent){
        mSpeac =speac;
        setFiistItemOffsets(parent);
    }

3.第三步 在getItemOffsets 方法中设置我们的偏移量

   /**
     *
     * @param outRect  Item矩形边界
     * @param view  ItemView 本身
     * @param parent recyclerview
     * @param state  recyclerview 的状态
     */
    @Override
    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        //设置偏移量
        outRect.left=mSpeac;
    }

4.第四步,我们需要在setFiistItemOffsets 方法中设置每一列第一个Item的偏移量,否则会出现
每列的第一个Item与边界之间有分割线,这明显不符合我们的代码需求和常识


image.png
    private void setFiistItemOffsets(RecyclerView parent){
        //在这里我们需要用到一个 margin 的属性
        // margin 属性的原理是   当我们的值为 正数时, 距离边界有一定的距离  当我们的值为 负数时,超出我们的边界一定的距离

        LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) parent.getLayoutParams();
        layoutParams.leftMargin= - mSpeac;
        parent.setLayoutParams(layoutParams);
    }

最后我们在java代码中调用即可。


image.png

所以在 setFiistItemOffsets 方法中,我们把第一个的值设置为负。。
欢迎大家留言共同学习。

上一篇 下一篇

猜你喜欢

热点阅读