RecyclerView再封裝

RecyclerView做為ListView的替代品辟狈,已經(jīng)出了很久了菩混,既然是替代品弱贼,那自然有些ListView沒有的優(yōu)點。比如說:可以隨意切換list,grid,stagger陡鹃『嫫郑可以指定一個或多個item刷新,而不再是全部刷新萍鲸。另外可以為每個item添加動畫谎倔,在體驗上更進一步。

但是也有不少“缺點”

  1. divider沒以前好畫了猿推,其實是因為divider支持多種樣式,方便自己定義了捌肴。以前divider就是一根線蹬叭,現(xiàn)在可以加margin,加多條線状知,某行不加divider等需求秽五。ItemDecoration=>Item裝飾器,名副其實饥悴。
  2. 沒有OnItemClickListener坦喘,RecyclerView的解耦方式太漂亮了,LayoutManager負責(zé)計算布局西设,Adapter負責(zé)適配瓣铣,Holder負責(zé)渲染Item,ItemDecoration負責(zé)items間隔贷揽,ItemAnimator負責(zé)item動畫棠笑,Recycler負責(zé)回收復(fù)用。RecyclerView就是個中控啊禽绪,只負責(zé)調(diào)度蓖救。所以它為了不破壞自己的解耦,就讓每個item自己去實現(xiàn)點擊事件印屁,萬一要Drag循捺,Move,Swipe呢雄人,對吧从橘。
  3. 阿西巴,沒有header footer,上述2中已經(jīng)說過了洋满。RecyclerView不愛干實事兒晶乔,就負責(zé)調(diào)度,UI的事都是Adapter負責(zé)干的啊牺勾。你給RecyclerView了它也不知道給你加到哪里去正罢。想實現(xiàn),就去找Adapter吧驻民。

關(guān)于API翻具,以及RecyclerView的用法Stay就不多說了,網(wǎng)上都有回还。我們來討論討論裆泳,如何將RecyclerView真正投入到項目中去。

我們不愿意使用新東西柠硕,一是怕有bug工禾,二是怕不滿足需求,三是怕沒有現(xiàn)成的成熟的封裝類可以用蝗柔,不想自己寫闻葵。

github上有很多基于RecyclerView的封裝,Stay覺得還不夠徹底癣丧。使用起來還是不夠方便槽畔。特別是UltimateRecyclerView,根本不叫封裝胁编,簡直就是堆代碼厢钧,看起來功能強大,實際上能用到10%的樣式就不錯了嬉橙。請勿使用這種代碼早直,功能越多,改起來就更復(fù)雜啊憎夷。

Stay理想的封裝模式是這樣的:

  1. 大家還記得ListActivity嘛莽鸿,就是那個將ListView和Adapter定義在父類,讓子類去繼承的∈案現(xiàn)在RecyclerView支持List祥得,Grid,Stagger蒋得,不做個BaseListActivity多可惜级及,好多默認配置都可以放父類,最簡單的子類Activity只需要load數(shù)據(jù)以及bindHolder就完了额衙。
    recycler00.png

    recycler01.png

    連Adapter都不用寫了饮焦。

  2. 以SwipeRefreshLayout為例怕吴,想要RecyclerView支持下拉刷新,加載更多县踢,必然要將兩者封裝到一起转绷,再建一個Controller類,這個Controller還是負責(zé)調(diào)度硼啤,將SwipeRefreshLayout與RecyclerView的調(diào)度方法再寫一遍议经,外層只需要跟Controller溝通。
    recycler02.png
  3. 想要實現(xiàn)加載更多谴返,需要讓Adapter去負責(zé)煞肾,原生的Adapter不支持,那就需要再抽一個BaseListAdapter來擴展嗓袱,itemType籍救,itemCount,onCreateFooterViewHolder都由這個抽象類來filter渠抹,這樣子類就不需要管footer這事蝙昙,只需要繼承BaseListAdapter,就自動支持加載更多梧却。
    recycler03.png
  4. 加載更多的footer有兩個坑耸黑,在stagger模式下,findLastVisiblePositions這返回的是數(shù)組,在list篮幢,grid模式下返回的是int,在未來可能會自定義LayoutManager为迈,那可能又會發(fā)生變化三椿,那么就需要定義一個算法,然后不同的模式都實現(xiàn)它葫辐,這樣在Controller中只需要調(diào)這個算法搜锰,拿到值就搞定了。你可以用策略模式來解決它耿战。
    recycler04.png

    recycler05.png

    用策略模式蛋叼,是不想在Controller中instanceOf與強轉(zhuǎn),并且如果有自定義的LayoutManager剂陡,那以后就需要去改動Controller狈涮。

  5. 加載更多另一個坑就是,在grid和stagger模式下鸭栖,footer要占滿一行而不是一個span歌馍。所以grid需要SpanSizeLookup來動態(tài)改footer所占的spanCount。而stagger呢晕鹊,需要將viewholder中的itemView的LayoutParams中isFullSpan設(shè)置為true松却。確實很麻煩暴浦,但你依然可以用策略模式來解決它。
    recycler06.png

    recycler07.png
  6. 假如要實現(xiàn)Section分組晓锻,那就再定義一個BaseSectionListActivity去繼承BaseListActivity歌焦,再做一次封裝與隔離。這樣子類只要繼承BaseSectionListActivity就擁有了一個支持分組砚哆,下拉刷新独撇,加載更多的這樣一個控件。并且支持list窟社,grid券勺。

以上是Stay所想的封裝方式,沒有什么高深的算法灿里,只是簡單的通過控件的組合关炼,API的靈活運用。當(dāng)然如果你要支持drag匣吊,move儒拂,sticky-section-header,那就需要額外做工作了色鸳。但那些畢竟是少數(shù)社痛,將業(yè)務(wù)需求中常用的UI形式進行封裝才是必要的。

如果能看明白命雀,說明功底很扎實蒜哀,我想大家肯定也能自己實現(xiàn),或者對接那些開源RecyclerView Lib吏砂,做一個BaseListActivity, BaseListFragment還是相當(dāng)爽的撵儿,少寫了很多代碼。

如果希望參考我的封裝過程以及源代碼狐血,可以參考這篇文章:封裝那些事-100行擼一個妹紙圖

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淀歇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子匈织,更是在濱河造成了極大的恐慌浪默,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缀匕,死亡現(xiàn)場離奇詭異纳决,居然都是意外死亡,警方通過查閱死者的電腦和手機乡小,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門岳链,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人劲件,你說我怎么就攤上這事掸哑≡技保” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵苗分,是天一觀的道長厌蔽。 經(jīng)常有香客問我,道長摔癣,這世上最難降的妖魔是什么奴饮? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮择浊,結(jié)果婚禮上戴卜,老公的妹妹穿的比我還像新娘。我一直安慰自己琢岩,他們只是感情好投剥,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著担孔,像睡著了一般江锨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上糕篇,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天啄育,我揣著相機與錄音,去河邊找鬼拌消。 笑死挑豌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的墩崩。 我是一名探鬼主播浮毯,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泰鸡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起壳鹤,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤盛龄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后芳誓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體余舶,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年锹淌,在試婚紗的時候發(fā)現(xiàn)自己被綠了匿值。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡赂摆,死狀恐怖挟憔,靈堂內(nèi)的尸體忽然破棺而出钟些,到底是詐尸還是另有隱情,我是刑警寧澤绊谭,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布政恍,位于F島的核電站,受9級特大地震影響达传,放射性物質(zhì)發(fā)生泄漏篙耗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一宪赶、第九天 我趴在偏房一處隱蔽的房頂上張望宗弯。 院中可真熱鬧,春花似錦搂妻、人聲如沸蒙保。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽追他。三九已至,卻和暖如春岛蚤,著一層夾襖步出監(jiān)牢的瞬間邑狸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工涤妒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留单雾,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓她紫,卻偏偏與公主長得像硅堆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贿讹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容