2014-11-04 47 views
207

從Android開發者(Creating Lists and Cards):RecyclerView與ListView控件

的RecyclerView widget是 ListView中的更先進,更靈活的版本。

好吧,這聽起來很酷,但是當我看到這個示例圖片時,我對這兩者之間的差異感到非常困惑。

enter image description here

上面的圖片可以很容易地通過用ListView定製適配器創建的。

那麼,在什麼情況下應該使用RecyclerView

+4

[第一次看到,機器人-recyclerview(http://www.grokkingandroid.com/ first-glance-androids-recyclerview /) – 2014-11-04 06:02:08

+1

@ Dev786:我建議你在這裏添加一個評論,詳細解釋你在這個問題上許多**現有答案中缺少的感受。 – CommonsWare 2017-11-13 11:45:41

回答

280

RecyclerView創建爲一個ListView改善,所以是的,你可以創建ListView控件的附表,但使用RecyclerView是因爲它更容易:

  1. 重複利用細胞,同時滾動向上/向下 - 這可以通過在listView適配器中實現View Holder來實現,但這是可選的,而在RecycleView中,它是寫入適配器的默認方式。

  2. 解耦列表從其容器 - 所以你可以把列表項容易在運行時在不同的容器(LinearLayout中,網格佈局)與設置佈局管理

實施例:

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); 
mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
//or 
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); 
  • 動畫處理共同的列表的動作 - 動畫被解耦並委派給ItemAnimator
  • 還有更多關於RecyclerView,但我認爲這些點是主要的。

    因此,總結而言,RecyclerView是一種更靈活的控件,用於處理「列表數據」,它遵循關注代表模式併爲其自身留下一項任務 - 回收項目。

    +2

    你能解釋第二點嗎? – 2015-05-21 06:07:12

    +10

    列表視圖的主要職責是1.)在給定區域內可視地安排項目,最好是2.)重用項目。 使用RecylerView可以分解成單個職責 - 回收視圖回收,並且給定LayoutManager將項目排列在屏幕上。 換句話說,回收視圖不知道/關心將物品放置在屏幕上的哪個位置,它只是照顧回收它們。 來自android文檔: 「通過更改LayoutManager,RecyclerView可用於實現標準垂直滾動列表,統一網格,交錯網格,水平滾動集合等。」 – daneejela 2015-05-21 10:11:20

    +22

    「向上/向下滾動時重複使用單元格」:As遠我知道這是完全錯誤的因爲即使在沒有查看者的列表視圖中也會發生這種情況。 – Ruban 2016-05-11 14:22:39

    30

    要使列表視圖具有良好的性能,您需要實現持有者模式,這很容易搞砸,特別是當您想用多種不同類型的視圖填充列表時。

    RecyclerView烘焙這種模式,使其更難以搞砸。它也更加靈活,使得處理不同的佈局變得更加容易,不像線柵那樣是直線的。

    +4

    是的! ,應該有更多的討論關於何時*不*使用recyclerview。如果您的行具有基於模型數據動態添加的內容,並且您使用Recycler視圖BOOM。 – 2015-08-19 12:27:57

    +1

    您應該可以根據模型數據添加動態內容。您只需要爲想要支持的任何類型的內容設置不同的視圖。 – CaptRespect 2015-08-31 14:43:23

    19

    RecyclerView是一個新的ViewGroup,它準備以類似的方式呈現任何基於適配器的視圖 。它被認爲是 的後繼ListView and GridView,它可以在 latest support-v7 version中找到。該RecyclerView已經發展 充分考慮擴展,所以它可以創建任何類型的 佈局你能想到的,但也不是沒有一點疼痛的最屁股 劑量。從Antonio leiva

    compile 'com.android.support:recyclerview-v7:27.0.0' 
    

    RecyclerView採取

    答案確實是一個powerful viewListView。 欲瞭解更多詳情,你可以訪問This page

    +3

    我喜歡你的答案中的這句話:**這是Android,所以事情從來都不容易**這對於Android應用程序開發一直存在是正確的,但我認爲他們如何設計API也是錯誤的作爲構建Android應用程序的模式。理論上講,好的設計應該隱藏程序員的所有可能的複雜性(但仍然可以用於高級的),他們通常關心的是業務邏輯,數據和其他算法,而不是處理與UI相關的問題(以及目前存在的更乏味的問題在Android開發中)。 – Hopeless 2016-07-25 02:26:12

    28

    ListViewRecyclerView的祖先。有很多事情,ListView要麼沒有做,要麼做得不好。如果你要收集ListView的缺點,並通過將問題抽象到不同的域來解決問題,那麼最終會得到類似於回收者視圖的東西。以下是主要問題點與列表視圖:

    • 沒有強制View回用於同一項目類型(看看那些在ListView使用的適配器之一,如果你研究getView方法,你會看到沒有什麼能阻止程序員從創建每一行一個新的觀點,即使一個通過convertView變量傳遞)

    • 並沒有阻止昂貴findViewById用途(即使你被回收的意見,指出上面有可能爲開發者致電findViewById更新子視圖的顯示內容的主要用途ListViews中的模式用於緩存findViewById調用。但是,只有當您知道它時纔可用,因爲它不是平臺的一部分)

    • 僅支持垂直滾動顯示行顯示視圖(Recycler視圖不關心放置視圖的位置以及它們如何放置它被抽象成LayoutManager。因此回收站可以像上面那樣支持傳統的ListView,以及像GridView這樣的東西,但它並不侷限於此,它可以做更多的事情,但是你必須進行編程足部工作,使其發生)。

    • 添加/刪除的動畫不是被考慮的用例。完全取決於你如何解決這個問題(比較RecyclerView。Adapter類通知*方法產品v ListViews以獲得想法)。

    總之RecyclerView是一種更爲靈活的作爲在ListView,儘管更多的代碼可能需要對您的部分完成。

    12

    主要優勢:

    ViewHolder是默認不可用在ListView。我們將在getView()內明確創建。 RecyclerView已內置Viewholder

    2

    在我看來RecyclerView是爲了解決listviews中使用的回收模式的問題,因爲它讓開發人員的生活變得更加困難。 所有其他你可以處理更多或更少。 例如我使用相同的適配器爲ListViewGridView這兩個視圖都沒有關係getView,getItemCount,getTypeCount被使用,所以它是相同的。 RecyclerView不需要如果ListViewListAdapterGridView與網格適配器已經爲你工作。 如果您在列表視圖中正確實施了ViewHolder模式,那麼您將看不到比RecycleView有任何大的改進。

    3

    我認爲他們的主要和最大區別在於ListView尋找物品在創建或放置時的位置,另一方面RecyclerView尋找物品的類型。如果使用相同類型創建了另一個項目RecyclerView不會再次創建它。它詢問第一個適配器,然後詢問回收池,如果回收池說「是的,我創建了一個類似於它的類型」,那麼RecyclerView不會嘗試創建相同的類型。 ListView沒有這種池化機制。

    11

    在這裏輸入代碼在整個線程結束之後,

    如果ListView適合你,沒有理由遷移。如果你是 編寫一個新的用戶界面,你可能會更好使用RecyclerView。

    RecylerView具有內置的ViewHolder,不需要像在listView中一樣實現我們自己的 。它支持在特定索引通知以及

    似水般的動畫添加或移除項目已 在RecyclerView實現的,您無需做任何事情

    我們可以用一個RecyclerView佈局管理器相關聯,這樣可以是 用於在recycleview中獲取隨機視圖,而這是ListView中的限制 在ListView中,唯一可用的視圖類型是 垂直ListView。甚至沒有官方的方式來實現水平ListView的 。現在用的是RecyclerView,我們可以有一個

    ⅰ)LinearLayoutManager - 支持垂直和水平 列表,ⅱ)StaggeredLayoutManager - 支持Pinterest的像 交錯列表,ⅲ)GridLayoutManager - 這支持顯示 網格作爲可見圖庫應用。

    最好的事情是,我們可以根據需要動態地完成所有這些工作。

    2

    我工作了一點RecyclerView,仍然更喜歡ListView

    1. 當然,他們都使用ViewHolders,所以這不是一個優勢。

    2. A RecyclerView在編碼上比較困難。

    3. A RecyclerView不包含頁眉和頁腳,所以它是一個負數。

    4. A ListView不需要製作ViewHolder。如果你想要一個帶有部分或副標題的列表,那麼創建獨立的項目(沒有ViewHolder)是一個好主意,這很容易,並且不需要單獨的類。

    +1

    您可以在回收站視圖適配器中創建標題和內容端,並且它比listview更靈活。只是很難改變你的頭腦listview到recyclerview,但如果你能做到這一點,你會明白我的意思.listview廢棄只是去嘗試學習recyclerview goodluck – erginduran 2016-09-25 12:55:14

    +2

    @erginduran,我用這兩個。 ListView仍然被廣泛使用,不被棄用。它也比RecyclerView浪費更少的內存。如果你只想用RecyclerView替換ListView,它不會是一個好主意。 – CoolMind 2016-09-26 06:15:46

    +0

    只是檢查爲什麼這個傢伙開發recyclerview?其對listview的改進,對嗎?在谷歌播放中有許多舊的庫和應用程序,所以你是正確的listview仍然廣泛used.just留下舊的東西在過去。檢查比較 - > [鏈接](http://stackoverflow.com/questions/28525112/android-recyclerview-vs-listview-with-viewholder) – erginduran 2016-09-26 18:11:20

    3

    除了以下以上的差異是更少數:

    1. RV分離視圖創建和數據的結合,以查看。 在LV中,在將數據綁定到它之前,您需要檢查convertView是否爲null以創建視圖。 因此,在RV的情況下,只有在需要時纔會創建視圖,但在LV的情況下,可能會錯過對convertview的檢查,並且每次都會創建視圖。

    2. 現在,使用LayoutManager更容易切換網格和列表。

    3. 即使只有單個項目發生更改,也無需通知並更新所有項目。

    4. 一個人必須在LV的情況下實現視圖緩存。 默認情況下,它在RV中提供。 (視圖緩存n回收有區別。)

    5. 在RV情況下非常容易的項目動畫。

    1
    1. 您可以使用一個接口來提供點擊收聽。我也使用這個 技術與ListViews。
    2. 無分隔線:只需在您的行中添加寬度爲 的視圖match_parent和1dp的高度併爲其指定背景顏色。
    3. 只需使用StateList選擇器作爲行背景。
    4. 在ListViews中也可以避免使用addHeaderView:只需將 標題放在View外面。

    所以,如果效率是你的顧慮,那麼是的,用RecyclerView代替ListView是一個好主意。

    0

    簡單的回答:您應該在想要顯示大量項目並且它們的數量是動態的情況下使用RecyclerView。只有當項目數量始終相同並且僅限於屏幕大小時,才應使用ListView。

    您發現它更難,因爲您只是在考慮Android庫。

    今天有很多選項可以幫助您構建自己的適配器,使您可以輕鬆構建可以選擇,重新排序,使用動畫,分隔符,添加頁腳,標題等的動態項目的列表和網格。

    不要害怕,試試看RecyclerView,你可以開始喜歡它,在ListView和RecyclerView中製作100個從網上下載的項目列表(如facebook新聞),你會看到不同的在UX中(用戶體驗),當您嘗試滾動時,測試應用程序可能會停止,甚至可以執行。

    我建議你檢查這兩個庫的製作容易適配器:

    FastAdapter by mikepenz

    FlexibleAdapter by davideas