CoordinatorLayout & AppBarLayout
就能夠說實現。
可是對於下面這種呢?git
首先整個頁面的UI結構是經過
RecyclerView
實現的。github
對於上面這個Sticker的實現是在佈局的最上方添加了一個和RecyclerView
中要吸頂的Item如出一轍的佈局。而後監聽RecyclerView
的滾動:bash
mPostDetailRv.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
if (pageStatus == null || pageStatus.stickerPos == -1) return
val preHolder = recyclerView.findViewHolderForAdapterPosition(pageStatus!!.stickerPos - 1)
val targetHolder = recyclerView.findViewHolderForAdapterPosition(pageStatus!!.stickerPos)
var offset = if (targetHolder != null) { //滾出去了
-targetHolder.itemView.top
}else{
0
}
if (preHolder != null) {
offset = -1
}
if (offset < 0) {
mPostDetailCommentHeaderSticker.visibility = View.GONE
} else {
mPostDetailCommentHeaderSticker.visibility = View.VISIBLE
}
}
}
複製代碼
上面pageStatus.stickerPos
是Sticker
在RecyclerView
中的數據的位置。上面的邏輯寫的其實比較複雜,不過確實實現了需求(-_-), 我解釋一下:ide
即我判斷Sticker
是否出現依賴於itemView.top
和Sticker
的前一個itemview
:佈局
Sticker的 itemview
顯示在RecyclerView
中,則根據它itemView.top
來判斷它是否滾動到了頂部itemview
已經不在RecyclerView
中了(被回收了),那說明它確定滾出去了,這時直接顯示上面的邏輯很奇怪,不過確實實現了吸頂的需求。ui
不過在後面的需求迭代中Sticker ItemView的前一個ItemView
會不斷變化,因而上面這段代碼就出現了bug。。。。 那怎麼解決呢?spa
最後靈機一動,對於StickerItemView的顯示我徹底能夠不依賴於前面這個ItemView
:code
mPostDetailRv.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
val currentDataPos = recyclerView.getChildAdapterPosition(recyclerView.getChildAt(0))
if (pageStatus != null && currentDataPos < pageStatus.stickerPos) {
mPostDetailCommentHeaderSticker.visibility = View.GONE
} else {
mPostDetailCommentHeaderSticker.visibility = View.VISIBLE
}
}
})
複製代碼
上面這段代碼很輕鬆的修復了bug。而且它的邏輯很簡單,也很通用:cdn
判斷當前RecyclerView顯示的第一個條目的位置是否大於StickerItem的位置,若是大於就展現吸頂Stickerget
效果:
上面這種實現僅適用UI結構是RecyclerView的狀況
PASS : 若是你就是這麼作的,請無視我(-_-)
更多小分享 : AdvancedAndroid