這幾天都在折騰RecyclerView添加分組在最開始使用BaseRecyclerViewAdapterHelper這個(gè)類庫來解決問題
使用它有個(gè)條件得繼承MultiItemEntity,分組也得在添加model一個(gè)Group標(biāo)記顿锰,對(duì)代碼有入侵不說,我們還有很多不同的類型例如空出一個(gè)之類的忘苛,都使用model標(biāo)記,刪除的時(shí)候巨痛苦趣避。
前幾天看到Android仿微信通訊錄:懸停頭部分組列表**受到啟發(fā)尸执,但里面的是LinearLayoutManager.應(yīng)用場(chǎng)景沒有覆蓋到自身情況婚夫,干脆自己寫一個(gè)
ItemDecoration有三個(gè)方法需要用到的
- onDraw每次滾動(dòng)時(shí)都會(huì)調(diào)用到浸卦,在這里畫出分欄的圖形
- onDrawOver每次滾動(dòng)時(shí)都會(huì)調(diào)用到,這里畫出的圖形最位于View的最頂層案糙,下面的圖層都會(huì)被覆蓋
3 .getItemOffsets每次顯示新的cell會(huì)調(diào)用限嫌,用于控制cell的margin,這里用于空出分欄高度的位置
下面記得一步步實(shí)現(xiàn)的方式 - 為分欄預(yù)留位置靴庆,由于使用的是GridLayoutManager,需要判斷所在行是不是包含Group標(biāo)記(也可以抽象成類似UICollectionView的dataSource一樣通過外部判斷)
- 畫出分欄圖形
小心的是onDraw不會(huì)幫忙迭代, 我是用First和Last分別找到當(dāng)前需要繪制的rect萤皂,然后上色
- 最后畫出頂部的分欄和產(chǎn)生推動(dòng)的效果
displayHeaderRect是一個(gè)SparseArrayCompat用于記錄當(dāng)前屏幕分欄的Rect, Rect的坐標(biāo)和iOS不太一樣所以需要更新top和bottom才會(huì)有效果