1. 程式人生 > >listview 和RecycleView區別

listview 和RecycleView區別

RecyclerView和ListView之間的區別

在我們要搞清楚一個問題之前,首先要搞清楚為什麼,是什麼,

最後才能得出結論

一:為什麼會出現recycleView

RecyclerView並不會完全替代ListView(這點從ListView沒有被標記為@Deprecated可以看出),兩者的使用場景不一樣。但是RecyclerView的出現會讓很多開源專案被廢棄,例如橫向滾動的ListView, 橫向滾動的GridView, 瀑布流控制元件,因為RecyclerView能夠實現所有這些功能。比如有一個需求是螢幕豎著的時候的顯示形式是ListView,螢幕橫著的時候的顯示形式是2列的GridView,此時如果用

RecyclerView,則通過設定LayoutManager一行程式碼實現替換。

ListView vs RecyclerView,ListView相比RecyclerView,有一些

優點:

addHeaderView(), addFooterView()新增頭檢視和尾檢視。通過”android:divider”設定自定義分割線。setOnItemClickListener()和setOnItemLongClickListener()設置點選事件和長按事件。這些功能在RecyclerView中都沒有直接的介面,要自己實現(雖然實現起來很簡單),因此如果只是實現簡單的顯示功能,ListView無疑更簡單。

RecyclerView相比ListView,有一些明顯的優點:預設已經實現了View的複用,不需要類似if(convertView == null)的實現,而且回收機制更加完善。預設支援區域性重新整理。容易實現新增item、刪除item的動畫效果。容易實現拖拽、側滑刪除等功能。RecyclerView是一個外掛式的實現,對各個功能進行解耦,從而擴充套件性比較好。RecyclerView是Android 5.0提出的新UI控制元件,可以用來代替傳統的ListView

ListView實現區域性重新整理

我們都知道ListView通過adapter.notifyDataSetChanged()實現ListView的更新,這種更新方法的缺點是全域性更新,即對每個Item View都進行重繪。但事實上很多時候,我們只是更新了其中一個Item的資料,其他Item其實可以不需要重繪。

我們通過ListView的getChildAt()來獲得需要更新的View,然後通過getTag()獲得ViewHolder,從而實現更新。

RecyclerView的標準實現步驟如下:

  • 建立Adapter:建立一個繼承RecyclerView.Adapter<VH>的Adapter類(VH是ViewHolder的類名),記為NormalAdapter。

  • 建立ViewHolder:在NormalAdapter中建立一個繼承RecyclerView.ViewHolder的靜態內部類,記為VH。ViewHolder的實現和ListView的ViewHolder實現幾乎一樣。

  • 在NormalAdapter中實現:

    • VH onCreateViewHolder(ViewGroup parent, int viewType): 對映Item Layout Id,建立VH並返回。

    • void onBindViewHolder(VH holder, int position): 為holder設定指定資料。

    • int getItemCount(): 返回Item的個數。

可以看出,RecyclerView將ListView中getView()的功能拆分成了onCreateViewHolder()onBindViewHolder()

ListView只提供了notifyDataSetChanged()更新整個檢視,這是很不合理的。RecyclerView提供了notifyItemInserted(),notifyItemRemoved(),notifyItemChanged()等API更新單個或某個範圍的Item檢視

1.檢視持有人

在ListView中,定義檢視持有者是保持檢視引用的建議方法。但這不是強制。雖然通過不這樣做,ListView使用顯示陳舊的資料。不使用檢視持有者的另一個主要缺點可能導致每次都通過id查詢檢視的繁重操作。這導致了ListView的滯後。

類。這是RecyclerView和ListView中的主要區別之一。實現RecyclerView時,此類用於定義介面卡用來將ViewHolder與位置繫結的ViewHolder物件。另外需要指出的是,在實現RecyclerView介面卡的同時,提供ViewHolder是強制性的。這使得實現有點複雜,但解決了ListView面臨的問題。

2.佈局管理器

當談到ListView時,只有一種型別的ListView可用,即垂直ListView。您不能使用水平滾動來實現ListView。我知道有些方法可以實現水平滾動,但相信我並不是按照這種方式工作的。

但是現在,當我們看看Android RecyclerView vs ListView時,我們也支援橫向集合。事實上它支援多種型別的列表。為了支援多種型別的列表,它使用RecyclerView.LayoutManager類。這是ListView沒有的新東西。RecyclerView支援三種預定義佈局管理器:

  •  - 這是RecyclerView中最常用的佈局管理器。通過這個,我們可以建立水平和垂直滾動列表。
  •  - 這個佈局管理器可以用來顯示網格,就像任何圖片庫一樣。

3.Item動畫

列表中的動畫是一個全新的維度,具有無限的可能性。在ListView中,因此沒有特殊的規定,通過它可以動畫,新增或刪除專案。而後來隨著android演變而來的ViewPropertyAnimator是由Google的Chet Haase在本視訊教程中提出的 用於ListView中的動畫。

另一方面,比較Android RecyclerView vs ListView,它有RecyclerView.ItemAnimator用於處理動畫的類。通過這個類,可以為專案新增,刪除和移動事件定義自定義動畫。它還提供了一個DefaultItemAnimator,以防你不需要任何定製。

4.介面卡

ListView介面卡很容易實現。他們有一個主要方法getView曾經發生過的所有魔法。那些觀點被繫結到一個位置。他們也曾經有一個有趣的方法  在哪裡可以在介面卡中設定觀察者。此功能也存在於RecyclerView中,但RecyclerView.AdapterDataObserver中類用於它。但贊成ListView的觀點是它支援三種介面卡的預設實現:

而RecyclerView介面卡具有ListView介面卡除了支援DB遊標和ArrayLists之外的所有功能。RecyclerView.Adapter中截至目前,我們必須制定一個自定義實現來向介面卡提供資料。就像BaseAdapter一樣為ListViews做。雖然如果您想了解更多關於RecyclerView介面卡實現的


5.分隔符

要在ListView中顯示自定義分隔符,可以在ListView XML中輕鬆新增這些引數:

XHTML
12android:divider="@android:color/transparent"android:dividerHeight="5dp"

關於Android RecyclerView的一個有趣的部分是,截至目前它預設情況下不顯示專案之間的分隔符。儘管谷歌的這些人一定是故意為此定製化的。但這大大增加了開發人員的工作量。如果您希望在專案之間新增分隔線,則可能需要使用RecyclerView.ItemDecoration 類


6. OnItemTouchListener

但另一方面,RecyclerView.OnItemTouchListener介面用於檢測Android RecyclerView中的觸控事件。它使實現變得複雜一點,但它為開發人員攔截觸控事件提供了更大的控制。官方文件指出,它可以用於手勢操作,因為它在交付給RecyclerView之前攔截觸控事件


7.結論

我想結束這個Android RecyclerView vs ListView比較,說RecyclerView被填充將會有很多可定製的功能。它對於實現複雜的列表或網格非常有用。但是與ListView相比,它有點難以實現,因為它包含需要實現的多個類,列表頁展示介面,需要支援動畫,或者頻繁更新,區域性重新整理,建議使用RecyclerView,更加強大完善,易擴充套件;其它情況(如微信卡包列表頁)兩者都OK,但ListView在使用上會更加方便,快捷