IM多型別holder封裝

獨星發表於2020-11-06

如標題,這是一個在列表多型別檢視時的一個簡化封裝方法,減少多餘程式碼,提高複用性,更好迭代擴充套件,先看檢視列表效果圖

 

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

 

 

 

咋一看感覺就是一個普通的列表,但是要講的也不是效果,可以看到一般im列表頁型別畢竟多,程式碼邏輯較複雜,如果沒有好好的複用封裝後面冗餘過多,擴充套件麻煩

最普通的寫法應該是直接在介面卡的bind方法里根據返回的型別,然後switch,碼不同的邏輯,因為每個型別的樣式都不同,而且邏輯也不一樣,所以在沒有什麼思路的情況下最容易的一種做法

當然,很多人都會想到這樣不好,要封裝一波,抽象成base,避免switch繁瑣的操作,然後在bind裡通過base類呼叫,達到複用的操作,我也覺得這樣挺好的,不過後來發現還是可以進一步的優化,而且這樣還能在原來的基礎上更好的達到複用的效果,

因為這樣一來就相當於把邏輯都放在了viewholder裡面,這樣也就導致了viewholder裡面會有很多重複的操作,比如設定頭像,變換訊息狀態等,這樣一來是不是覺得還有優化的餘地呢,因為基本上每個型別都少不了頭像和狀態,而且一般樣式都是統一的,

所以這就讓我生出一個優化的方法來了,把這些共同的地方抽出來當作base,裡面的內容檢視動態的填充進去,而且如果不想這樣或者想完全改變型別的樣式也能通過動態設定來解決,達到一個很好擴充套件的效果

實現思路:

  首先寫base xml,把頭像狀態一些通用的寫進去,然後在 createholder 給內容填充處一個容器檢視,建立具體的 holder,這一步操作大致跟通常的建立沒有什麼大區別,區別在於給檢視容器填充了內容檢視,以往的都是一整個xml直接載入,現在分為了base和內容。

  接下來是封裝 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

  

 

相關文章