前言
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)度去看了看源碼,上截圖。

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


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

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)然,如果大家有更好的解法歡迎留言。