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

当我们需要设置分割线的时候,实际上就是对我们每一个Item的内容进行一定量的偏移,从而达到,我们想要的效果。

原理讲完了,直接贴上代码,大家图文对照更容易理解。
代码实现
1.第一步,我们需要去继承Recyclerview.ItemDecoration。 并重写里面的方法。

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与边界之间有分割线,这明显不符合我们的代码需求和常识

private void setFiistItemOffsets(RecyclerView parent){
//在这里我们需要用到一个 margin 的属性
// margin 属性的原理是 当我们的值为 正数时, 距离边界有一定的距离 当我们的值为 负数时,超出我们的边界一定的距离
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) parent.getLayoutParams();
layoutParams.leftMargin= - mSpeac;
parent.setLayoutParams(layoutParams);
}
最后我们在java代码中调用即可。

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