BaseRecyclerViewAdapterHelper與ScrollView嵌套沖突解決

前言

Hello,各位小伙伴們大家好啊,明天就是周五了,想想還有點(diǎn)小激動(dòng)。不過話說回來,激動(dòng)歸激動(dòng),文章還是要寫的,今天要寫的文章是昨天碰到的一個(gè)坑,花了一下午的時(shí)間才搞定,所以記錄一下,如果以后小伙伴們誰碰到了就不用再花那么久了!好了,閑話不多說,進(jìn)入今天的正題,BaseRecyclerViewAdapterHelper!

什么是BaseRecyclerViewAdapterHelper

BaseRecyclerViewAdapterHelper是Github上一個(gè)開源項(xiàng)目,其實(shí)就是幫你把RecyclerView.Adapter做了一層封裝,但是你可以不要小看這一層封裝,他能做的事情絕對(duì)超乎你的想象,比如

  • 優(yōu)化Adapter代碼

和原始的adapter相對(duì),減少70%的代碼量。

  • 添加Item事件

Item的點(diǎn)擊事件
Item的長按事件
Item子控件的點(diǎn)擊事件
Item子控件的長按事件

  • 添加列表加載動(dòng)畫

一行代碼輕松切換5種默認(rèn)動(dòng)畫。

  • 添加頭部、尾部

一行代碼搞定,感覺又回到ListView時(shí)代。

  • 自動(dòng)加載

上拉加載無需監(jiān)聽滑動(dòng)事件,可自定義加載布局,顯示異常提示,自定義異常提示。同時(shí)支持下拉加載。

  • 分組布局

隨心定義分組頭部。

  • 多布局

簡單配置、無需重寫額外方法。

  • 設(shè)置空布局

比Listview的setEmptyView還要好用。

  • 添加拖拽、滑動(dòng)刪除

開啟,監(jiān)聽即可,就是這么簡單。

  • 樹形列表

比ExpandableListView還要強(qiáng)大,支持多級(jí)。

  • 自定義ViewHolder

支持自定義ViewHolder,讓開發(fā)者隨心所欲。

  • 擴(kuò)展框架

組合第三方框架,輕松實(shí)現(xiàn)更多需求定制。

至于具體的使用方案我這里就不一一列出了,想使用這個(gè)框架的童鞋可以去這個(gè)簡書地址看看,作者官方的使用文檔http://m.itdecent.cn/p/b343fcff51b0

正題

前面也說了,寫這篇文章的目的呢,主要是為了解決一個(gè)沖突,那就是當(dāng)你用ScrollView嵌套R(shí)ecyclerView的時(shí)候,同時(shí)你又開啟了BaseRecyclerViewAdapter的上拉加載更多setOnLoadMoreListener,那么問題就會(huì)出現(xiàn)了,你會(huì)發(fā)現(xiàn)你的RecyclerView會(huì)不停的加載更多,根本停不下來,就像吃了炫邁一樣,這里效果不太好演示,我就不截圖了,大家如果這樣使用的話一定會(huì)碰到,那么是為什么呢?

原因其實(shí)很簡單,因?yàn)槟阍赟crollView中嵌套R(shí)ecyclerView的時(shí)候,必定會(huì)手動(dòng)計(jì)算高度,不然就導(dǎo)致只會(huì)顯示一行的bug出現(xiàn),就是因?yàn)槟闶謩?dòng)計(jì)算了高度,從而導(dǎo)致BaseRecyclerViewAdapter的加載更多出現(xiàn)了問題,你每一次計(jì)算出所有條目的高度,BaseRecyclerViewAdapter就認(rèn)為你已經(jīng)準(zhǔn)備開始加載下一次數(shù)據(jù)了,從而形成無限加載更多的問題。

有些朋友就想了,我看到BaseRecyclerViewAdapter文檔里面有一個(gè)方法叫disableLoadMoreIfNotFullPage(),作用是不滿一屏的時(shí)候不會(huì)自動(dòng)加載,確實(shí),我剛開始也是以為調(diào)用這個(gè)方法就能解決無限加載更多的bug,但是并沒有什么卵用,反而你的加載更多失效了,這又是為什么呢?于是乎抱著鉆研的態(tài)度去看了看源碼,上截圖。


disableLoadMoreIfNotFullPage方法源碼

大家可以看到先是調(diào)用了checkNotNull(),其實(shí)就是檢查recyclerView是否為空,這個(gè)顯然不會(huì)為空,那么就要看下面的方法了。


checkNotNull方法
disableLoadMoreIfNotFullPage方法

大家可以看到,代碼其實(shí)并不多,為什么加載更多會(huì)失效呢?大家看第一行代碼,setEnableLoadMore(false),一進(jìn)來就給你關(guān)掉了,再看判斷


if判斷

findLastCompletelyVisibleItemPosition()的返回值永遠(yuǎn)是你拿到集合的最大索引值,+1剛好與后面的getItemCount()相等,所以setEnableLoadMore(true)永遠(yuǎn)都不會(huì)進(jìn),所以加載更多失效。

沖突解決

這上面巴拉巴拉說了一大堆,主要是為了告訴大家出現(xiàn)這個(gè)bug的原因。。。少俠,把刀放下,這就給你帶來解決思路。
我自己的解決思路,就是把整個(gè)界面只留RecyclerView,其他的作為RecyclerView的header,也就相當(dāng)于刪除了ScrollView,當(dāng)然這也要得益于BaseRecyclerViewAdapter的強(qiáng)大,添加頭部,只需要輕輕調(diào)用一下addHeaderView()即可,雖然看起來很輕松就解決了,不過我自己卻是嘗試了很多種解法,都沒辦法,只有這樣才能達(dá)到效果,記錄一下。當(dāng)然,如果大家有更好的解法歡迎留言。

以上純屬于個(gè)人平時(shí)工作和學(xué)習(xí)的一些總結(jié)分享,如果有什么錯(cuò)誤歡迎隨時(shí)指出,大家可以討論一起進(jìn)步。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,366評(píng)論 25 708
  • 又到了更新博文的時(shí)間了,最近在看一本很不錯(cuò)的心理學(xué)書籍,名字叫做 《拖延心理學(xué)》,封面長下面這樣子 書的內(nèi)容主要是...
    ec95b5891948閱讀 57,929評(píng)論 38 472
  • 1. 六月十七號(hào),三十歲生日那天,他請了一個(gè)星期的假。 老板倒是挺爽快地答應(yīng)了他,一來正值公司業(yè)務(wù)淡季,二來正好給...
    紅綠文盲閱讀 690評(píng)論 4 4
  • 俗話說十個(gè)女人九個(gè)斑,女人和斑有著親密的關(guān)系,在三十歲以前也許你們不相信,有人說我天生麗質(zhì),皮膚好,白,不會(huì)長斑的...
    瓷玉聯(lián)合創(chuàng)始人閱讀 307評(píng)論 0 0
  • 一周的時(shí)間很快就結(jié)束了,《自控力》也拆完了,效率真是高。 自控力是一種心想事成的能力-我想要 自控力其實(shí)是每個(gè)人都...
    G先生_海林閱讀 199評(píng)論 0 0

友情鏈接更多精彩內(nèi)容