靈活且強大的RecyclerViewAdapter原始碼分析

陳宇明發表於2016-06-29

雖然工作可以不涉及編碼,但是本著對編碼的熱愛,於是在業餘時間寫了一個關於RecyclerViewAdapter高度定製的開源庫。

相信大家RecyclerView應該不會陌生,大多數開發者應該都使用上它了,它也是google推薦替換ListView的控制元件,但是用過它的同學應該都知道它在某些方面並沒有ListView使用起來方便,需要我們額外的編寫程式碼,今天就給大家介紹一個Github上面的一個開源庫,有了它讓你使用RecyclerView的時候,和ListView一樣的好用!它的名字叫做「BaseRecyclerViewAdapterHelper」,直接輸入「www.recyclerview.org」可以直接訪問。接下來不僅僅要給大家介紹它能做什麼,還要分析它的原理是如何實現。

節省Adapter大量程式碼量

效果

靈活且強大的RecyclerViewAdapter原始碼分析
如此的複雜佈局!

程式碼使用

靈活且強大的RecyclerViewAdapter原始碼分析
賦值程式碼不過10行!

原理分析

找到重複部分程式碼,抽取到基類,非重複部分用抽象方法代替,具體讓子類實現。
我們可以從上面的程式碼塊中看到,他繼承了BaseQuickAdapter,其實BaseQuickAdapter重寫了重複的程式碼,根據java的繼承特性,兒子繼承爸爸的財產,所以兒子很輕鬆,做的事情很少。

靈活且強大的RecyclerViewAdapter原始碼分析
BaseQuickAdapter

接下來我們再來看看關於賦值的BaseViewHolder

靈活且強大的RecyclerViewAdapter原始碼分析
viewHolder

它裡面做了一個快取機制,避免了重複載入view,把常用的set方法全部寫好了,但是需要注意載入網路圖片這一塊需要開發者自己載入,因為考慮到實戰專案中都有自己的圖片載入庫,如果封裝在裡面就耦合了,不能強迫所有的開發者都使用框架內建的圖片載入庫,所以在使用的程式碼塊裡面,我們可以看到它是通過一個getView的方法拿到imageView物件再去通過自己的常用圖片載入框架去做相應的圖片載入。

新增點選事件

RecyclerView沒有ItemClick方法,可以在上面提過的BaseQuickAdapter裡面新增ItemClick,網上有很多寫法都是在onBindViewHolder
裡面寫,功能是可以實現但是會導致頻繁建立,應該在onCreateViewHolder()
中每次為新建的 View 設定一次就行了。如果想新增長按事件,也同理。

程式碼使用

靈活且強大的RecyclerViewAdapter原始碼分析

原理分析

靈活且強大的RecyclerViewAdapter原始碼分析

列表載入動畫

效果

靈活且強大的RecyclerViewAdapter原始碼分析
列表載入動畫

程式碼使用

靈活且強大的RecyclerViewAdapter原始碼分析

原理分析

靈活且強大的RecyclerViewAdapter原始碼分析

關於開啟動畫

首先判斷是否開啟動畫,然後判斷是否是自定義動畫還是使用者選擇的自帶動畫,然後對動畫的操作元素進行遍歷執行,執行時間為300毫秒,由於上面說了每次填充資料都會呼叫,所以如何不判斷的話,就會導致上下滑動每次都會重複呼叫動畫,動畫本身是會耗費效能的。

控制載入次數

只需要新增一個mLastPosition來儲存滑動過的位置,然後判斷滑動的位置是否被滑動過,這樣就可以避免每次都新增動畫了。不過為了滿足喜歡動畫多過於效能的開發者,如果你想要每次滑動都帶動畫可以設定isFirstOnly屬性即可,預設是不開啟的。

新增頭部尾部

效果

靈活且強大的RecyclerViewAdapter原始碼分析

使用程式碼

靈活且強大的RecyclerViewAdapter原始碼分析

原理分析

實際上就定義多個不同型別的佈局

  1. 重寫getItemViewType()方法,根據需求規則給出不同的type值。
  2. 在onBindViewHolder()裡面根據不同holder的型別來賦予相對於的資料
  3. 如果有額外佈局(如:頭部尾部)需要修改getItemCount()方法的返回數量

新增頭部和尾部(額外佈局)

在上面的基礎之上再重寫getItemCount()在原本資料量上加上根據額外佈局的數量,程式碼如下

靈活且強大的RecyclerViewAdapter原始碼分析
注意:如果是新增頭部
那就必須在原onBindViewHolder()
裡面position-頭部數量,因為不減去的話,那麼資料就會從第二條開始遍歷,所以要注意!
靈活且強大的RecyclerViewAdapter原始碼分析

篇幅有限,今天就介紹到這裡,除了這些功能還有更多實用功能!專案持續更新中,覺得對自己有幫助的朋友可以star一下

靈活且強大的RecyclerViewAdapter原始碼分析

最後奉上github原始碼地址:https://github.com/CymChad/BaseRecyclerViewAdapterHelper

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

靈活且強大的RecyclerViewAdapter原始碼分析

相關文章