天天看點

真實項目運用-RecyclerView封裝 前言 項目結構 RecyclerView基礎 ViewHolder 多Item布局實作 一種item布局的實作: 加載更多以及header 和footer的添加 添加section分區操作: 參考連結

剛好解決了昨天在鴻洋部落格下看到的這個小問題。哈哈。希望對大家有幫助。

真實項目運用-RecyclerView封裝 前言 項目結構 RecyclerView基礎 ViewHolder 多Item布局實作 一種item布局的實作: 加載更多以及header 和footer的添加 添加section分區操作: 參考連結

首先看看我的項目結構,項目分為common 和module子產品,這裡對之前整個項目的架構進行了改造,沒有了之前的library,取而代之的是将所有公用元件放在了common包中,這是每個項目都可以copy使用的部分。在module包中就是具體每個項目的每個子產品。比如這個示例項目中,包含

真實項目運用-RecyclerView封裝 前言 項目結構 RecyclerView基礎 ViewHolder 多Item布局實作 一種item布局的實作: 加載更多以及header 和footer的添加 添加section分區操作: 參考連結

整體結構

recyclerview元件作為每個項目中都可以使用的元件,這裡放在common-widgets-recyclerview包下。

真實項目運用-RecyclerView封裝 前言 項目結構 RecyclerView基礎 ViewHolder 多Item布局實作 一種item布局的實作: 加載更多以及header 和footer的添加 添加section分區操作: 參考連結

這裡可以看到的recyclerview元件這裡添加了adapter,base,divider,section,utils,wrapper包。下面來進行深入的講解以及怎樣在項目開發中進行使用吧。

真實項目運用-RecyclerView封裝 前言 項目結構 RecyclerView基礎 ViewHolder 多Item布局實作 一種item布局的實作: 加載更多以及header 和footer的添加 添加section分區操作: 參考連結

recyclerview公用元件

recyclerview is a more advanced and flexible version of listview. this widget is a container for large sets of views that can be recycled and scrolled very efficiently. use the recyclerview widget when you have lists with elements that change dynamically. recyclerview 是android l版本中新添加的一個用來取代listview的sdk,它的靈活性與可替代性比listview更好。recyclerview與listview原理是類似的:都是僅僅維護少量的view并且可以展示大量的資料集。在recyclerview标準化了viewholder類似于listview中convertview用來做視圖緩存。

viewholder是google在優化listview性能的技巧上就提到的,雖然google并沒有強制使用,但事實上它已經成為listview的編寫規範。在recyclerview上,viewholder的使用成為了一種強制手段了。接下來對封裝的viewholder進行分析:

首先來看看viewholder的用法,這是一個簡單的擷取string數組并展現到textview上。通過數組的大小來建立item的數量。

當然這裡隻是簡單的一個textview,但是當資料多起來之後,很多textview,imageview,以及代碼段

都可以進行稍微修改。現在viewholder修改如下:

這裡需要關注的是getview方法,直接傳回目前view的類型。

是以我們可以在使用viewholder的時候

就完成了textview的settext操作。而沒有進行類型轉換。當然這裡省去了findviewbyid的步驟的同時,使用<code>private sparsearray&lt;view&gt; mviews</code> 進行所有view的儲存,也就是在犧牲一定記憶體性能的情況下,確定了代碼的整潔性。還需要關注上面的

這也是我們使用recyclerview和listview中過程中經常遇到的問題。看看網易新聞的清單樣式,頂部大圖,标題+三張圖檔,标題+左側圖檔,視訊樣式,廣告樣式....... 這種情況我們怎麼便捷快速處理呢?

真實項目運用-RecyclerView封裝 前言 項目結構 RecyclerView基礎 ViewHolder 多Item布局實作 一種item布局的實作: 加載更多以及header 和footer的添加 添加section分區操作: 參考連結

看看通常處理itemview的type類型不同的方法:

并且在 oncreateviewholder()針對不同的viewtype進行不同的viewholder建立。

同時,這樣使用不同的type 來處理不同的位置的資料,也能解決listview中經常遇到的一個問題,那就是header和footer 的view的添加。我們隻需要針對首尾位置進行itemviewtype 的處理并且傳回header和footer的view就行了。

這裡也對這種情況進行了處理的封裝:

看看實際項目中的效果,一個adapter就完成了所有的不同的item類型操作。

整個類繼承自<code>multiitemtypeadapter&lt;t&gt;</code>:

來看看multiitemtypeadapter&lt;t&gt;

<code>multiitemtypeadapter&lt;t&gt;</code>,這裡主要完成了list形式添加資料,資料類型使用泛型操作,隻需要在構造函數中,或者public方法 <code>adddataall</code>就可以添加清單類型資料。利用<code>itemviewdelegatemanager</code>完成不同類型type的管理.而添加不同的type是對接口<code>itemviewdelegate</code>的實作。<code>itemviewdelegatemanager</code>起到了一個中間管理者和代理者的作用。具體看下面的代碼:

這裡也就解決了多種itemviewtype的問題。實作了友善的添加不同的類型的item資料。泛型資料降低了代碼的耦合度。

這裡提供一種item布局,就隻需要對multiitemtypeadapter&lt;t&gt;進行限定一種layout類型。并且isforviewtype方法傳回true,代表着始終傳回目前的layout。

那麼對于隻有一種類型的清單資料

具體的新聞類型:

這裡也就實作了單一的清單形式,比如網易新聞的專題樣式:

真實項目運用-RecyclerView封裝 前言 項目結構 RecyclerView基礎 ViewHolder 多Item布局實作 一種item布局的實作: 加載更多以及header 和footer的添加 添加section分區操作: 參考連結

這裡直接參加wrapper包中幾個類,

真實項目運用-RecyclerView封裝 前言 項目結構 RecyclerView基礎 ViewHolder 多Item布局實作 一種item布局的實作: 加載更多以及header 和footer的添加 添加section分區操作: 參考連結

這裡的header和footer沒有個數的限制。

現在需求又來了 。需要對recyclerview中的item進行分區操作,就比如說微信以b開頭的姓名都放在b這個分區下,以c開頭的名字,都在c這個分區下。比如說京東的這個界面

清單資料裡面添加了分區。那麼怎麼操作呢?

真實項目運用-RecyclerView封裝 前言 項目結構 RecyclerView基礎 ViewHolder 多Item布局實作 一種item布局的實作: 加載更多以及header 和footer的添加 添加section分區操作: 參考連結

也就是代碼中的recyclerview-section包中的部分。

真實項目運用-RecyclerView封裝 前言 項目結構 RecyclerView基礎 ViewHolder 多Item布局實作 一種item布局的實作: 加載更多以及header 和footer的添加 添加section分區操作: 參考連結

1) 建立自定義 section 類內建自 statelesssection

2) 添加section到adapter,注意這裡是sectionrvadapter

看看界面效果

真實項目運用-RecyclerView封裝 前言 項目結構 RecyclerView基礎 ViewHolder 多Item布局實作 一種item布局的實作: 加載更多以及header 和footer的添加 添加section分區操作: 參考連結

整個代碼由于是對<code>recyclerview.adapter</code>封裝。是以需要關注的方法自然是<code>getitemviewtype</code>,<code>onbindviewholder</code>,<code>createviewholder</code>和<code>getitemcount</code>四個方法,下面以這四個方法為切入點進行分析:

初始化需要關注的是這裡使用hashmap對section進行存儲。也就實作了後面的根據section的添加順序依次展示section到recyclerview中。

真實項目運用-RecyclerView封裝 前言 項目結構 RecyclerView基礎 ViewHolder 多Item布局實作 一種item布局的實作: 加載更多以及header 和footer的添加 添加section分區操作: 參考連結

oncreateviewholder完成的是viewholder的建立,每一個section分為頭部header,底部footer。以及中間部分,中間布局可以有loading/loaded/failed三種狀态分别對應加載,加載成功,失敗界面。注意這裡的狀态都分别對應于每個section裡面,而不是整個recyclerview.

也就是說一個recyclerview可以由多個section組成,一個section最多隻能有一個header和footer,section由多個recyclerview的item條目組成。每個section中間可以有三種狀态。loading/loaded/failed三種狀态分别對應加載,加載成功,失敗界面。
真實項目運用-RecyclerView封裝 前言 項目結構 RecyclerView基礎 ViewHolder 多Item布局實作 一種item布局的實作: 加載更多以及header 和footer的添加 添加section分區操作: 參考連結

和前面<code>multiitemtypeadapter&lt;t&gt;</code>的實作一樣,我們需要根據不同viewtype建立不同的viewholder.但是需要注意的是一個section是由一組item組成的,是以一個section需要多次的調用oncreateviewholder進行建立不同的類型的樣式。

接下來關注<code>onbindviewholder</code>方法,通過

<code>int sectiontotal = section.getsectionitemstotal();</code>擷取到了section的item的數量,并在下方針對每個section的頭部header,底部footer,以及中間部分進行操作。并且調用<code>onbindheaderviewholder(holder)</code>,

<code>onbindfooterviewholder(holder)</code>

以及<code>onbindcontentviewholder(holder, getsectionposition(position))</code>方法,這就是當我們實作section代碼的時候需要實作的方法。<code>section.getsectionitemstotal()</code>也是我們實作section的時候提供的section的item的個數。

接下來關注getitemcount,代表整個recyclerview的item的個數。當然是所有section的item的總和,是以代碼如下。

真實項目運用-RecyclerView封裝 前言 項目結構 RecyclerView基礎 ViewHolder 多Item布局實作 一種item布局的實作: 加載更多以及header 和footer的添加 添加section分區操作: 參考連結

最後需要關注的是方法<code>getitemviewtype</code>,這裡也就完成了每個section的五種類型的int傳回操作。

最後針對最近項目中遇到的這個問題,針對不同的布局,比如說下面的這個既有grid,又有linear的形式。由于之前的問題全部是針對一個recyclerview的,而一個recyclerview在調用<code>recyclerview.setlayoutmanager()</code>方法的時候,就隻能有一個布局方式。好吧,當初我就是為了解決這個問題,後來才發現需要用三個recyclerview來解決。

真實項目運用-RecyclerView封裝 前言 項目結構 RecyclerView基礎 ViewHolder 多Item布局實作 一種item布局的實作: 加載更多以及header 和footer的添加 添加section分區操作: 參考連結
注:這裡不能提供實際項目代碼,隻能提供代碼片段作為參考。目前暫未提供示例代碼到github的項目中,隻提供了recyclerview公用元件。

<a target="_blank" href="https://github.com/hongyangandroid/baseadapter">baseadapter github</a>

<a target="_blank" href="http://blog.csdn.net/lmj623565791/article/details/51118836">為recyclerview打造通用adapter 讓recyclerview更加好用</a>

<a target="_blank" href="http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0307/4032.html">recyclerview源碼分析</a>

<a target="_blank" href="http://www.jianshu.com/p/16712681731e">recyclerview技術棧</a>

真實項目運用-RecyclerView封裝 前言 項目結構 RecyclerView基礎 ViewHolder 多Item布局實作 一種item布局的實作: 加載更多以及header 和footer的添加 添加section分區操作: 參考連結
真實項目運用-RecyclerView封裝 前言 項目結構 RecyclerView基礎 ViewHolder 多Item布局實作 一種item布局的實作: 加載更多以及header 和footer的添加 添加section分區操作: 參考連結

繼續閱讀