轉(zhuǎn)載請標明出處:http://m.itdecent.cn/p/e5e094e70b8e
本文出自:Jlanglang
前言
實際開發(fā)中,社交或者商城類,新聞類的app,大部分的頁面都是列表.
寫列表adapter的速度,基本決定整個app的開發(fā)速度.
還記得剛做安卓的時候,寫listview的adpater,寫一個列表寫一下午.簡直喪心病狂.
之后出現(xiàn)了RecyclerView,還有一大批優(yōu)秀的開源Adapter.代碼已經(jīng)很省心了.
然而,在做一個項目時,不同的列表可能會出現(xiàn)部分重復(fù),靠寫adapter來復(fù)用就搞不定了。
再比如,復(fù)雜的多type列表還是會出現(xiàn)上百行代碼在onBindViewHolder里面的情況,維護不易。
說說為什么我要寫TreeRecyclerView
最開始目的,僅僅是為了解決多級折疊列表.
傳送門:一個RecyclerView實現(xiàn)多級折疊列表(一)
傳送門:一個RecyclerView實現(xiàn)多級折疊列表(二)
但是更新到現(xiàn)在,TreeRecyclerView這個名字其實已經(jīng)不適合了.
隨著具體使用,更新優(yōu)化,我發(fā)現(xiàn)RecyclerView的Adapter可以換種思想,換個寫法.
簡介:
為了便于閱讀,下文會用item來表示列表的條目。
(一)MVP
以下個人見解
從RecyclervView的角度來分析:
M:塞給adapter的list數(shù)據(jù)就是modle
V:recyclerview
P:adapter。
從adapter的角度來分析,將adapter拆成多個P(Item):
P:
如果把不同type的item看成一個個可以復(fù)用的presenter.
每寫一種item,就代表該項目里多一個可以復(fù)用的presenter
adapter的onbindviewholder將沒有具體的綁定邏輯
綁定操作在各種item里完成,邏輯更清晰,修改維護更容易。
M:
每一種Item對應(yīng)一種Model.
可以跟后臺設(shè)計model的屬性,
根據(jù)特定的屬性來控制要展示的item樣式.
然后通過創(chuàng)建工廠,生成List<Item>
一行搞定item的創(chuàng)建
不用多寫其他代碼.
M可以決定創(chuàng)建什么樣的Item.也就是P
V:
每一種Item,都需要對應(yīng)的view類型,我目前直接用布局id來代表view
這一塊還是缺陷,目前的設(shè)計,個人覺得不完美.
(二)設(shè)計模式
組合模式:
如果把每種item之間關(guān)系看作View和ViewGruop一樣.
那么組合就會有無限可能.
什么多級列表多type(有些設(shè)計還是會不和諧,得從layoutmanager下手)都不是問題。
ViewGroup可以包含多種類型的子View,并且繼承于View.
裝飾模式:
對于改動需求,某些功能,用裝飾者模式來完成修改是快速的.且不影響原代碼
比如添加頭部和尾部view,添加emptyView,item側(cè)滑刪除功能.
各種封裝adpater之間隨意裝飾組合,個人覺得比較高效,但是裝飾過多難掌控.
工廠模式:
創(chuàng)建item不應(yīng)該是一個苦力活,大可以通過工廠來生成各種item.只需配置一下數(shù)據(jù)model和Item的對應(yīng)關(guān)系.
責任鏈:
item寫了個簡單的事件攔截
策略模式:
基本就是抽象功能.能夠用子類實現(xiàn)替換.這種用的地方挺多的
舉個adapter場景例子:
需求初定:
需求定下來了,一個好友列表.展示好友,點擊跳轉(zhuǎn)(分分鐘搞定)
第一次修改:
這個時候產(chǎn)品說這樣不行,得加個首字母分類,側(cè)邊索引定位
......于是,吐槽一番去找索引定位的demo.然后adapter一堆改.(改你mb)
第二次修改:
光有索引也不行,再加個下拉刷新,上啦加載分頁.加載時動畫,空數(shù)據(jù)頁面
好,去找demo.繼續(xù)改(心力憔悴)
第三次修改:
哥們,這個好友列表再加上側(cè)滑刪除怎么樣??
.....(信不信我刪庫跑路)
這個時候,是不是有砍人的沖動了..
沒辦法,接著找demo.然后對著adapter一頓加功能.
到這個狀態(tài),如果不用裝飾,不用繼承.我估計是寫不下去的.
第n次修改:
這個列表能不能加個頭部啊,上次那個需求好像不太好,去掉吧.
這個列表能實現(xiàn)點擊折疊嗎?這個有bug啊.....(已陣亡)
我們的大部分時間就花在這些修改上面了.雖然描述的有點喪心病狂
但確確實實,基本都會改個幾次的.
懟產(chǎn)品也不能解決問題.自身強大才是硬道理
上面的問題,我是這么處理的,看看就好(0- 0)

不管是加功能還是去功能,改動地方并不會特別大.
最后來張喪心病狂的效果圖:

總結(jié):
水平有限,設(shè)計模式也是懂點皮毛.設(shè)計上很多問題.一個人設(shè)計確實挺難的.但也學(xué)到了很多東西.
這篇文章主要講個思路,具體用法其實在其他兩篇文章里面寫的挺詳細的了.雖然現(xiàn)在有些類刪了,有些類改名了.思路和前兩篇文章也有點出路
但大致用法沒變的.有興趣可以看看.
希望我的經(jīng)歷能讓你學(xué)到點東西
下一篇文章,大概會把這個項目demo里的例子都詳細描述一下.
---------------------------------分割線---------------------------------------
傳送門:TreeRecyclerView
已經(jīng)有52顆星了,挺高興的.哈哈
喜歡與回復(fù)是我最大的動力-_-
只要有新的idea,我就會更新上去.