2015-02-08 33 views
203

Android的文件說:我們應該使用RecyclerView來替換ListView嗎?

的RecyclerView widget是 ListView中的更先進,更靈活的版本。這個小部件是一個容器,用於顯示大數據集 ,通過維護有限數量的視圖可以非常有效地滾動。使用RecyclerView插件時,你有數據收集 的元素在運行時改變基於用戶行爲或網絡 事件

其實ListView能做到以上的,如果效率沒有關係,我們發現有很多問題當我們使用RecyclerView更換ListView

  1. 沒有onItemClickListener()爲列表項選擇 - solution

  2. 列表項之間無隔離 - solution

  3. 無內置重疊選擇,有當您單擊列表項沒有視覺反饋 - solution

  4. 沒有addHeaderView的列表標題 - solution

也許更多的問題...

所以,當我們使用RecyclerView來取代ListView,我們必須做很多額外的編碼才能達到與ListView相同的效果。

問題:

  • 是否值得我們更換ListViewRecyclerView完全?
  • 如果不是那麼在這種情況下我們應該更好地使用RecyclerView而不是ListView,反之亦然?
+8

你的線程只是第一個問題,而不是我的問題 – Xcihnegn 2015-02-08 10:33:46

+3

只要提到你必須使用recyclerview,如果你有興趣使用摺疊的操作欄。 https://medium.com/android-bites/first-steps-with-the-design-support-library-8dcf06230ddd – francas 2015-06-02 19:21:05

+4

awsm質量問題... – kiturk3 2015-11-24 06:17:43

回答

8

您可以使用一個接口來提供點擊收聽。我也使用這種技術與ListViews。
無隔離帶:只需將排在match_parent的寬度和1DP高度添加視圖並給它一個背景色
只需使用StateList選擇器作爲行背景。
addHeaderView也可以在ListViews中避免:簡單地把Header 置於的外部。

因此,如果效率是您的顧慮,那麼,用RecyclerView替換ListView是一個好主意。

+16

這些不是我的問題,我有鏈接爲每個問題的解決方案 – Xcihnegn 2015-02-08 10:30:41

+4

請參閱**問題** – Xcihnegn 2015-02-08 10:35:06

+2

看這裏:http://www.grokkingandroid.com/first-glance-androids-recyclerview/ – Josef 2015-02-08 13:30:35

112

如果ListView適用於您,則沒有理由遷移。 如果您正在編寫新的用戶界面,使用RecyclerView可能會更好。

當您需要自定義您的列表或您想要更好的動畫時,RecyclerView功能強大。 ListView中的這些便利方法給人們帶來了很多麻煩,這就是RecyclerView爲他們提供更靈活的解決方案的原因。

您需要爲遷移進行的主要更改是在您的適配器中。如果您想繼續撥打notifyDataSetChanged,則會失去大部分動畫&的優勢。但是如果你可以改變你的適配器來發送詳細的通知事件(添加/刪除/移動/更新),那麼你會得到更好的動畫和性能。這些事件讓RecyclerView選擇正確的動畫,並且還幫助它避免不必要的onBind調用。如果您的商品視圖很複雜,您將獲得巨大的收益。另外,未來,RecyclerView將會有更多的組件。

+2

如果我可以給你100 upvotes我會。 'notifyDataSetChanged()'方法導致我的'RecyclerView'不斷詢問新的'ViewHolders',並拋棄了'ViewHolder'模式的好處。尋找解決方案,我發現您的評論很順利地回答了我的問題:D謝謝! – 2016-07-14 23:06:24

+0

我不同意「如果您的產品視圖非常複雜,您將獲得巨大的收益」,如果其他適配器有3個回收站查看器,Recyclerview在我的情況下表現不佳。我不得不使用'isRecyclable(false)'來禁用回收,並且最終結果是高度滯後的RecyclerView。我甚至不能改變這一點,它會花費很多時間回到列表視圖:( – 2016-08-31 11:00:08

+4

人們使用RV瓦特/更多的類型,然後沒有任何問題和良好的性能 你的代碼還有其他錯誤你應該使用systrace/traceview並看看發生了什麼 – yigit 2016-08-31 20:39:21

3

當ListView不動態或不受網絡事件影響時,唯一可以使用ListView的情況仍然不錯。例如:導航。

對於任何其他用途,RecyclerView日食列表視圖。由於RecyclerView只關心回收,因此可以更容易地處理與ListView緊密結合的視覺相關事物,例如更改位置/重新排列,動畫(實際上它帶有RecyclerView.ItemAnimator),自定義佈局(除StaggeredGrid外,還有StaggeredGrid舊的列表或網格樣式,但也有這個library,它更擴展它)。

此外,如果你想使用CardView我相信這是唯一的出路(有些good reading何時使用卡或列表)。

+0

您是指從服務器抓取數據列表,存儲在手機上的sqlite將被用於列表顯示(可以說你的追隨者)最好使用一個回收者視圖,而不是一個視圖持有人的列表視圖? – Lion789 2016-03-09 03:06:50

+0

是的。但事實上,我沒有看到任何ListView的角色除了導航之外,那是因爲我認爲在那裏使用RecyclerView是過度的。 – inmyth 2016-03-12 07:21:50

21

根據我的說法,如果ListView滿足您的應用程序的所有當前需求並滿足所有用例,那麼不需要用RecyclerView替換它。

RecyclerView爲其開發人員提供了巨大的動力,其代價是增加了開發人員的複雜性。有一些事情可以在ListView中輕鬆完成,現在可以花費大量不必要的努力。

但是,有很多事情是ListView永遠不會做的,比如令人驚歎的LayoutManager功能,它可以讓您動態地將佈局動態更改爲水平,垂直,網格或交錯網格。

我寫了關於這個主題的詳細答案here

+1

當然,RecyclerView會增加複雜性,但至少它會爲您正確實現ViewHolder模式。 – 2016-02-11 15:23:36

+0

@IgorGanapolsky爲ViewHolder模式實現+1。 – 2017-09-13 13:15:27

1

一個很好的選擇是使用BaseAdapter。它支持使用Viewholder模式,而我的包含100多行位圖和按鈕,並且運行非常流暢。

相關問題