1. 程式人生 > >用Recyclerview實現列表分組、下拉重新整理以及上拉載入更多

用Recyclerview實現列表分組、下拉重新整理以及上拉載入更多

為什麼要使用Recyclerview替代ListView等傳統元件

目前的專案中已經逐步拋棄了ListView、GridView以及各種自定義的瀑布流效果的第三方庫了,統一用強大的替代者Recyclerview來實現。一個Recyclerview就解決了上面三種形式的佈局展示方式,而且不用修改多少程式碼就能實現,或許這就是Recyclerview被大家接受和使用的原因之一吧!當然,另一個重要的原因肯定是效能上的優化嘍!

經歷了從使用ListView到Recyclerview的轉變,其實是可以感覺到效能的提升的,具體的效能提升在哪?怎麼提升的?這裡不做探討和分析,本人也還沒有做過這方面的系統總結。所以,本文主要說說如何用Recyclerview來實現列表分組、下拉重新整理、上拉載入更多這樣一個功能。

下拉重新整理的實現

下拉重新整理的實現其實很簡單了,用SwipeRefreshLayout就行,當然,如果公司產品對下拉重新整理有特別的UI設計,那就另當別論。

上拉載入更多的實現

這種效果在Listview中就很方便的實現了,直接呼叫Listview的公有方法addFooterView(View view),並根據Listview的滾動狀態來重新整理FooterView中的內容。但是切換到Recyclerview後發現找不到這個方法了!!!呵呵,可是並沒有人告訴你Recyclerview有這個方法啊,(^__^) ,那有沒有替代的方法提供呢?答案是:也沒有!但是不要擔心,既然系統沒有提供現成的方法,那肯定就支援自己開發了,方法總是比困難多的。

下面就來說說上拉載入的實現。

首先,上拉載入的事情要在Adapter中來完成,定義一個ViewHolder,繼承自RecyclerView.ViewHolder:

FooterViewHolder.png

然後,覆寫RecyclerView.Adapter的getItemViewType方法:

這一步是關鍵,看程式碼也能看出來,這個方法要做的事情很簡單,就是區分Item的type型別,這裡定義了兩個型別的Type,TYPE_FOOTER和TYPE_ITEM,這個type會在後面用到:

下一步是指定列表的count,大家都很熟悉了,在listview中的adapter裡也有這樣一個方法叫getCount(),RecyclerView.Adapter裡叫getItemCount(),其實是一個意思。一般這個方法返回的都是資料來源的條數mDataList.size(),但是,這裡我給列表加了一個Footer,又不影響原始資料,那麼就需要在count的基礎上+1,然後在getItemViewType的時候,根據position是否為最後一條資料,來區分不同的ViewType。

接下來就是初始化Item佈局的操作了,也是重寫父類的方法onCreateViewHolder():

onCreateViewHolder.png

這裡的引數viewType就是我們在getItemViewType裡面返回的type。

最後就是繫結資料了,相關方法onBindViewHolder():

onBindViewHolder.png

這樣一來,基本上就可以實現載入更多的功能了,但是,還要提供給Activity或者其他元件一個方法來更新UI,比如,什麼時候顯示”正在載入…”,什麼時候顯示“載入完成”,什麼時候顯示“沒有更多資料”等狀態,這裡需要提供一個方法供外部呼叫:

setLoadingStatus.png

分組的實現
說了半天,說好的分組呢???其實實現了FooterView,再實現分組基本上就沒啥大問題了,同樣的原理,把分組的組名也定義一個ViewHolder,對應一個ViewType:

TItleViewHolder.png

getItemViewType也同樣根據資料來源中的標誌或者其他資訊,返回不同的type,這裡需要根據伺服器返回的資料具體操作,如果伺服器返回的資料不足以完成分組的話,那麼需要自己對資料進行封裝,這需要在setList(List list)方法裡完成,也就是設定資料來源的時候,這個過程一定要注意getItemCount返回的值,否則肯定會報錯。最後的效果如下:

分組實現

底部載入更多