IM多類型holder封裝

如標題,這是一個在列表多類型視圖時的一個簡化封裝方法,減小多餘代碼,提升複用性,更好迭代擴展,先看視圖列表效果圖git

 

GitHub:https://github.com/1024477951/FragmentAppgithub

 

 

 

咋一看感受就是一個普通的列表,可是要講的也不是效果,能夠看到通常im列表頁類型畢竟多,代碼邏輯較複雜,若是沒有好好的複用封裝後面冗餘過多,擴展麻煩優化

最普通的寫法應該是直接在適配器的bind方法里根據返回的類型,而後switch,碼不一樣的邏輯,由於每一個類型的樣式都不一樣,並且邏輯也不同,因此在沒有什麼思路的狀況下最容易的一種作法3d

固然,不少人都會想到這樣很差,要封裝一波,抽象成base,避免switch繁瑣的操做,而後在bind裏經過base類調用,達到複用的操做,我也以爲這樣挺好的,不事後來發現仍是能夠進一步的優化,並且這樣還能在原來的基礎上更好的達到複用的效果,xml

由於這樣一來就至關於把邏輯都放在了viewholder裏面,這樣也就致使了viewholder裏面會有不少重複的操做,好比設置頭像,變換消息狀態等,這樣一來是否是以爲還有優化的餘地呢,由於基本上每一個類型都少不了頭像和狀態,並且通常樣式都是統一的,blog

因此這就讓我生出一個優化的方法來了,把這些共同的地方抽出來看成base,裏面的內容視圖動態的填充進去,並且若是不想這樣或者想徹底改變類型的樣式也能經過動態設置來解決,達到一個很好擴展的效果繼承

實現思路:get

  首先寫base xml,把頭像狀態一些通用的寫進去,而後在 createholder 給內容填充處一個容器視圖,建立具體的 holder,這一步操做大體跟一般的建立沒有什麼大區別,區別在於給視圖容器填充了內容視圖,以往的都是一整個xml直接加載,如今分爲了base和內容。it

  接下來是封裝 baseholder,這樣就能夠把一些通用的方法操做邏輯寫進去,直接在bind裏調用,就算沒用填充的操做,其實也能直接在base裏封裝,只是這樣的話你在xml裏就顯的麻煩了,由於假如你的xml樣式須要修改一下,那麼你每一個xml都要去修改容器

  baseholder寫好了,對繼承類提供抽象方法,這樣能夠避免bind的時候轉換類型操做,直接經過base方法對每一個不一樣的類型自定義邏輯

 

 

這樣一來不管是xml仍是holder,仍是adapter,都是很方便的修改擴展,好比你修改xml裏的一個狀態圖標,只須要在base xml裏修改一下就好了,邏輯都不用動,須要修改狀態邏輯也只須要在baseholder裏面修改一下就好了,每一個類型的holder都通用,而差別化的邏輯通常只會在自定義的對應holder裏面改下就好了,擴展內容也是根據本身的需求在base或者child裏面編寫代碼,有沒有感受非常適合IM類型適配器,會話列表

 

GitHub:https://github.com/1024477951/FragmentApp

相關文章
相關標籤/搜索