分享一個實現吸頂Item的簡單方法

通常的對於上圖樣式的Sticker咱們使用 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.stickerPosStickerRecyclerView中的數據的位置。上面的邏輯寫的其實比較複雜,不過確實實現了需求(-_-), 我解釋一下:ide

即我判斷Sticker是否出現依賴於itemView.topSticker的前一個itemview:佈局

  1. 若是當前的Sticker的 itemview顯示在RecyclerView中,則根據它itemView.top來判斷它是否滾動到了頂部
  2. 若是它的前一個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

相關文章
相關標籤/搜索