前言
Hello伪很,各位小伙伴們大家好啊戚啥,明天就是周五了,想想還有點(diǎn)小激動(dòng)是掰。不過話說回來虑鼎,激動(dòng)歸激動(dòng),文章還是要寫的键痛,今天要寫的文章是昨天碰到的一個(gè)坑炫彩,花了一下午的時(shí)間才搞定,所以記錄一下絮短,如果以后小伙伴們誰碰到了就不用再花那么久了江兢!好了,閑話不多說丁频,進(jìn)入今天的正題杉允,BaseRecyclerViewAdapterHelper!
什么是BaseRecyclerViewAdapterHelper
BaseRecyclerViewAdapterHelper是Github上一個(gè)開源項(xiàng)目,其實(shí)就是幫你把RecyclerView.Adapter做了一層封裝席里,但是你可以不要小看這一層封裝叔磷,他能做的事情絕對超乎你的想象,比如
- 優(yōu)化Adapter代碼
和原始的adapter相對奖磁,減少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)大,支持多級拌喉。
- 自定義ViewHolder
支持自定義ViewHolder速那,讓開發(fā)者隨心所欲。
- 擴(kuò)展框架
組合第三方框架尿背,輕松實(shí)現(xiàn)更多需求定制端仰。
至于具體的使用方案我這里就不一一列出了,想使用這個(gè)框架的童鞋可以去這個(gè)簡書地址看看田藐,作者官方的使用文檔http://www.reibang.com/p/b343fcff51b0
正題
前面也說了荔烧,寫這篇文章的目的呢,主要是為了解決一個(gè)沖突汽久,那就是當(dāng)你用ScrollView嵌套RecyclerView的時(shí)候鹤竭,同時(shí)你又開啟了BaseRecyclerViewAdapter的上拉加載更多setOnLoadMoreListener,那么問題就會出現(xiàn)了景醇,你會發(fā)現(xiàn)你的RecyclerView會不停的加載更多臀稚,根本停不下來,就像吃了炫邁一樣三痰,這里效果不太好演示吧寺,我就不截圖了,大家如果這樣使用的話一定會碰到散劫,那么是為什么呢稚机?
原因其實(shí)很簡單,因?yàn)槟阍赟crollView中嵌套RecyclerView的時(shí)候获搏,必定會手動(dòng)計(jì)算高度抒钱,不然就導(dǎo)致只會顯示一行的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í)候不會自動(dòng)加載,確實(shí),我剛開始也是以為調(diào)用這個(gè)方法就能解決無限加載更多的bug募壕,但是并沒有什么卵用调炬,反而你的加載更多失效了,這又是為什么呢舱馅?于是乎抱著鉆研的態(tài)度去看了看源碼缰泡,上截圖。
大家可以看到先是調(diào)用了checkNotNull()代嗤,其實(shí)就是檢查recyclerView是否為空棘钞,這個(gè)顯然不會為空,那么就要看下面的方法了干毅。
大家可以看到宜猜,代碼其實(shí)并不多,為什么加載更多會失效呢硝逢?大家看第一行代碼姨拥,setEnableLoadMore(false),一進(jìn)來就給你關(guān)掉了渠鸽,再看判斷
findLastCompletelyVisibleItemPosition()的返回值永遠(yuǎn)是你拿到集合的最大索引值叫乌,+1剛好與后面的getItemCount()相等,所以setEnableLoadMore(true)永遠(yuǎn)都不會進(jìn)拱绑,所以加載更多失效综芥。
沖突解決
這上面巴拉巴拉說了一大堆,主要是為了告訴大家出現(xiàn)這個(gè)bug的原因猎拨。膀藐。。少俠红省,把刀放下额各,這就給你帶來解決思路。
我自己的解決思路吧恃,就是把整個(gè)界面只留RecyclerView虾啦,其他的作為RecyclerView的header,也就相當(dāng)于刪除了ScrollView痕寓,當(dāng)然這也要得益于BaseRecyclerViewAdapter的強(qiáng)大傲醉,添加頭部,只需要輕輕調(diào)用一下addHeaderView()即可呻率,雖然看起來很輕松就解決了硬毕,不過我自己卻是嘗試了很多種解法,都沒辦法礼仗,只有這樣才能達(dá)到效果吐咳,記錄一下逻悠。當(dāng)然,如果大家有更好的解法歡迎留言韭脊。