1. 说明
我们前边讲解的 给 RecyclerView设置分割线时,是有一个bug的,那就是最右边和最下边都会有一条线的,那么我们这节课就给大家解决这样的一个问题。
2. 思路分析
其实还是在 getItemOffsets()方法中留出分割线的位置,但是这次需要注意的是在每个item控件的最右边和 最下边的分割线不要去留位置就行,所以在这里需要判断:
2.1 如果是最后一列,让right = 0 ;
2.2 如果是最后一行,让bottom = 0 ;
并且在这里涉及到2个知识点的计算方式:
获取View在 父View中的位置:
// 获取当前位置
int currentPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition();
获取RecyclerView 的列数
/**
* 获取 RecyclerView的列数
* @param parent
* @return
*/
private int getSpanCount(RecyclerView parent) {
// 获取列数 列数存在于 GridLayoutManager中 ,所以这里需要强转,因为这里可能是
// LinearLayoutManager也可能是GridLayoutManager
// 所以这里需要判断当前是 LinearLayoutManager还是 GridLayoutManager
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
// 如果当前是GridView的样式的话 , 就强转为GridLayoutManager
if (layoutManager instanceof GridLayoutManager){
GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
// 列数
int spanCount = gridLayoutManager.getSpanCount() ;
return spanCount;
}
// 如果上边不是GridView的话,就return 1 ,表示返回的是 ListView的列数 为1列
return 1;
}
3. 现象
这里会有一个现象:
在GridView样式中,如果GridView 有3列,那么,最后一列宽度是比 前两列的宽度都要大, 如图所示:
这里 C的宽度 = A的宽度+分割线宽度 或者
C的宽度 = B的宽度+分割线宽度