1. 說(shuō)明
我們前邊講解的 給 RecyclerView設(shè)置分割線(xiàn)時(shí),是有一個(gè)bug的,那就是最右邊和最下邊都會(huì)有一條線(xiàn)的,那么我們這節(jié)課就給大家解決這樣的一個(gè)問(wèn)題。
2. 思路分析
其實(shí)還是在 getItemOffsets()方法中留出分割線(xiàn)的位置,但是這次需要注意的是在每個(gè)item控件的最右邊和 最下邊的分割線(xiàn)不要去留位置就行,所以在這里需要判斷:
2.1 如果是最后一列,讓right = 0 ;
2.2 如果是最后一行,讓bottom = 0 ;
并且在這里涉及到2個(gè)知識(shí)點(diǎn)的計(jì)算方式:
獲取View在 父View中的位置:
// 獲取當(dāng)前位置
int currentPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition();
獲取RecyclerView 的列數(shù)
/**
* 獲取 RecyclerView的列數(shù)
* @param parent
* @return
*/
private int getSpanCount(RecyclerView parent) {
// 獲取列數(shù) 列數(shù)存在于 GridLayoutManager中 ,所以這里需要強(qiáng)轉(zhuǎn),因?yàn)檫@里可能是
// LinearLayoutManager也可能是GridLayoutManager
// 所以這里需要判斷當(dāng)前是 LinearLayoutManager還是 GridLayoutManager
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
// 如果當(dāng)前是GridView的樣式的話(huà) , 就強(qiáng)轉(zhuǎn)為GridLayoutManager
if (layoutManager instanceof GridLayoutManager){
GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
// 列數(shù)
int spanCount = gridLayoutManager.getSpanCount() ;
return spanCount;
}
// 如果上邊不是GridView的話(huà),就return 1 ,表示返回的是 ListView的列數(shù) 為1列
return 1;
}
3. 現(xiàn)象
這里會(huì)有一個(gè)現(xiàn)象:
在GridView樣式中,如果GridView 有3列,那么,最后一列寬度是比 前兩列的寬度都要大, 如圖所示:

圖片.png
這里 C的寬度 = A的寬度+分割線(xiàn)寬度 或者
C的寬度 = B的寬度+分割線(xiàn)寬度