RecyclerView到底強大在哪里?

AnaOakley 7年前發布 | 13K 次閱讀 Android開發 移動開發 RecyclerView

魅力安卓

Hello,大家好!通過上次總結,我們回顧了一下ListView的用法,也知道了ListView的缺陷,比如:性能較差,需要采取手段提高性能;擴展性較差等。同時也知道了一個更為強大的滾動控件RecyclerView將要代替ListView的趨勢。那么,RecyclerView是怎樣實現的,究竟又強大在哪里?

今天,我們就一起來學習總結下吧~

先上圖(這里我們同樣采用神奇寶貝素材):

單憑橫向滾動這一點,就是ListView所做不到的。

1. 實現過程

不同于ListView,RecyclerView屬于新增控件,在使用之前需要先在build.gradle中引用依賴庫:support:recyclerview -v7 。

采取和ListView同樣的分析思路,要實現一個RecyclerView的demo,主要分兩步:

首先是布局的設計,主布局(activity_main)中,放入一個RecyclerView控件。再建一個子布局(pokemon_item),子布局中還是包含一個ImageView和一個TextView控件,分別用來顯示圖片和文字素材。

布局代碼如下:

然后是邏輯代碼的編寫,先看MainActivity:

我們可以看到,代碼中和ListView的MainActivity中代碼相同的,都是先通過fbc獲取到RecyclerView控件,new一個適配器adapter,調用setAdapter方法。

但是除此之外,我們可以看到紅框中標記出來的兩行代碼,這是干什么用的呢?我們稍后回過頭來再看,你就會明白了。

除了MainActivity,我們知道應該還有兩個類,一個是我們自己定義的適配器MyAdapter,另一個是實體類,用于適配器泛型的指向,初始化數據。這里我們簡化一下,除去實體類,只留下MyAdapter類,至于數據,我們采用直接賦值的簡便方法。

MyAdapter.java代碼如下:

梳理一下,代碼還是比較清晰的。首先我們定義MyAdapter類,繼承自Recycler.Adapter并將泛型指向MyAdapter.ViewHolder(MyAdapter中我們自己定義的一個內部類),接下來就是定義的ViewHoler內部類,內部類中又包括其成員變量和構造函數,以及一個初始化數據時用到的setData的方法;跳出內部類,就是整個MyAdapter類的構造函數,重寫的三個父類方法:onCreateViewHolder(用來加載子布局,并返回ViewHolder實例)、onBindViewHolder(調用setData方法,在子項滾進屏幕時,對RecyclerView子項數據進行賦值)、getItemCount(獲取RecyclerView子項的個數)。

這樣,在Myadapter中我們就完成了,數據初始化和適配器的內容。這是我們將思路返回到MainActivity紅框標注的兩行代碼處。我們可以理解,這應該是創建了一個LinearLayoutManager對象,通過setLayoutManager方法來指定了RecyclerView的布局方式。

此時運行代碼,即可展現與ListView相同的效果:

2. 多種布局樣式

通過上面的分心,可利用RecyclerView實現ListView上下滑動列表的效果。那么,橫向滾動的列表效果是怎樣實現的呢?得益于RecyclerView強大的擴展性,實現起來并不難,甚至僅通過幾行代碼即可達到我們想要的效果!

其中奧義就在于MainActivity中我們用紅框標注出來的那兩行代碼:

這里調用linearLayoutManger的setOrientation()方法,參數為HORIZONTAL(橫向),即可實現橫向效果!截圖如下:

聰明的你,應該發現了,這個LinearLayoutManger表示線性布局,可以通過setOrientation()方法設置布局的排列方向,默認為縱向。其實除此之外,RecyclerView還有GridLayoutManager(網格布局)和StaggerGridLayoutManager(瀑布流布局)的內置布排列方式。實現起來也很簡單,舉一反三,我相信你已經猜到,只需根據你的需要將LinearLayoutManager替換成GridLayoutManager或StaggerGridLayoutManager,傳入對應的參數,將其通過setLayoutManager賦給我們的RecyclerView即可。

橫向網格布局截圖如下:

當子項高度不一致時,瀑布流效果才更加好看,回頭我們會單獨在瀑布流相關的幾個小demo里面實現。

3. 強大之處在哪里?

通過上面的簡單分析,我們大概能總結出RecyclerView幾個優缺點:

1.相對于ListView而言,效率性能等的優化提升,MyAdapter中ViewHolder的編寫更加規范化,不在需要調用setTag等操作進行item復用;

2.更強的擴展性,更方便使用的多樣化布局效果。現在RecyclerView官方能夠支持的就包括了線性布局、網格布局、瀑布流布局的方式,其中還可以控制縱向還是橫向效果。這就意味著,你不必再去找橫向ListView、橫向GirdView、瀑布流效果等第三方開源控件,使用RecyclerView即可滿足你的要求。

3.另外在數據刷新、動畫效果等多方面,都有更多的優勢和玩法,看看還有點小激動呢,知識真是豐富呢,有種求知若渴的感覺^_^

4. 關于點擊事件

對了,關于RecyclerView的點擊事件,并不像ListView那樣通過setOnItemClickListener()監聽即可實現。而是需要我們對子項的每個View注冊點擊事件,實現相對可能較復雜一點,但是說實話,在你使用的時候你就會發現其隱藏的優勢:ListView的點擊事件是設置在子項上面的,并不能給子項里面某一個明確的控件設置點擊事件,就比如我們的子項包含一個ImageView和一個TextView,并不能設置單獨的點擊事件;而RecyclerView設置的點擊事件在具體的View中注冊,這樣稍微復雜點,但指向性更為明確。

RecyclerView的相關應用及擴展,還是很廣很迷人的。希望這篇總結能夠起到拋磚引玉的效果,望各位在日后的學習和應用中,不斷總結完善,體會RecyclerView更加深層次的奧妙~

 

 

來自:http://www.jianshu.com/p/7bd434d983e9

 

 本文由用戶 AnaOakley 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!