關於《RecyclerView的item新增懸浮層的效果》的問題反饋
前言
如果你還沒看過 ofollow,noindex">自定義View:實現RecyclerView的item新增懸浮層的效果 ,可以先閱讀上一篇。
上一週向郭神的微信公眾號投稿《RecyclerView的item新增懸浮層的效果》,看到有那麼多的朋友閱讀和留言評論,心情十分激動,文章已將近過去一週,閱讀的高峰期應該已經過去了,這裡針對評論反饋的問題,來寫一個解答篇。
正文
ListView版本已釋出
之前說會做一個ListView的版本,現在已經完成併發布到github上了。實現的思路和RecyclerView基本相同,只是在判斷child是否移除有一些不同,因為在ListView中沒有
addOnChildAttachStateChangeListener
image.gif
監聽,所以我們換一種思路:
// 判斷顯示浮層的child是否已經劃出螢幕 if (needFloatChild != null) { if (needFloatInScreen(firstVisibleItem, visibleItemCount)) { clearFloatChild(); } } private boolean needFloatInScreen(int firstVisibleItem, int visibleItemCount) { // 別忘了visibleItemCount包含了第一個可見的item,所以要減一 return needFloatChildPosition < firstVisibleItem || needFloatChildPosition > firstVisibleItem + visibleItemCount - 1; }
image.gif
我們在onScroll中判斷當前螢幕中顯示浮層的child是否在第一個可見和最後一個可見之中。其他的實現無太大變化,歡迎大家使用。
問題一:方案二中滑動停止新增浮層的效能問題
這個方案是我當時臨時想出來的方案,因為本人不是特別喜歡頻繁的新增或刪除View的操作,所以簡單思考後,就放棄了這種想法,但是沒想到很多朋友對於方案二非常的支援。於是我又仔細的研究了方案二和方案三,從實現思路上看,方案二和方案三基本相同:只是在得到顯示浮層的Child時,是執行addView,還是顯示浮層,其餘無變化。這次再重新做一次對比:
巢狀層級
方案二減少了巢狀的層級。可以直接繼承RecyclerView,通過重寫onScoll等相關方法實現此效果(內部實現)。而方案三需要在RecyclerView外部巢狀一個FramLayout,通過設定OnScrollListener實現(外部實現)。
開發成本
方案二減少了部分程式碼量。直接呼叫addView,比方案三中計算浮層位置更簡單。
對Adapter的入侵
方案二中,child中需要顯示浮層的根佈局受到了限制,只能使用類似FramLayout或者RelativeLayout這種佈局,才能覆蓋掉child的內容。而方案三對Adapter無入侵。
擴充套件性
方案二中,浮層的大小和位置都受到了child的限制,而方案三浮層的可顯示區域是整個RecyclerView的大小,相比之下,方案三的擴充套件性要稍強一些,例如,變態的需求舉例:浮層比child要大,或者顯示在child以外的位置。
滑動效能的對比
因為方案二中新增addView操作是在滑動靜止狀態,所以對於使用者是沒有感知的,除了那種極其變態的操作下,滑動效能幾乎是沒有影響。方案三是控制浮層的顯示和隱藏,也是同樣的道理,但是如果硬要摳,顯示的效率,肯定顯示和隱藏的效果更高一些。
耦合性的對比
有一個朋友提到了手勢重寫的問題:如果巢狀在ViewPager中需要重寫手勢怎麼辦,方案三相對於方案二的耦合性太高。
我幾經思考還是沒有想到該如何回答這個問題,因為方案二和方案三的操作都需要重寫手勢監聽,並且更新浮層的位置。如果需求和實現出現了衝突,無論哪一種方案都避免不了對View進行定製化。
所以在常見的應用場景中,方案二發揮的也是很棒的,也是值得推薦的一種方案。
問題二:如果是RecyclerView顯示多種型別的child,並且child的高度也不一樣,該怎麼辦
這位老鐵反饋的情況,是我之前沒想到的,所以我在維護的新版本中,在onShowFloatView和onHideFloatView中新增加了child引數,這樣就可以得到child的高度,加上position得到對應資料的型別,然後設定不同的浮層,就可以實現這個效果了。
總結
這次投稿的收穫真的很大,有這麼多朋友一起討論,非常的開心,看來以後我應該多投一投。
最後再貼出github地址: https://github.com/li504799868/FloatItemRecyclerView ,各位大佬多多fork。