listview 和RecycleView區別
RecyclerView和ListView之間的區別
在我們要搞清楚一個問題之前,首先要搞清楚為什麼,是什麼,
最後才能得出結論
一:為什麼會出現recycleView
RecyclerView並不會完全替代ListView(這點從ListView沒有被標記為@Deprecated可以看出),兩者的使用場景不一樣。但是RecyclerView的出現會讓很多開源專案被廢棄,例如橫向滾動的ListView, 橫向滾動的GridView, 瀑布流控制元件,因為RecyclerView能夠實現所有這些功能。比如有一個需求是螢幕豎著的時候的顯示形式是ListView,螢幕橫著的時候的顯示形式是2列的GridView,此時如果用
ListView vs RecyclerView,ListView相比RecyclerView,有一些
優點:
addHeaderView(), addFooterView()新增頭檢視和尾檢視。通過”android:divider”設定自定義分割線。setOnItemClickListener()和setOnItemLongClickListener()設置點選事件和長按事件。這些功能在RecyclerView中都沒有直接的介面,要自己實現(雖然實現起來很簡單),因此如果只是實現簡單的顯示功能,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()
。
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中輕鬆新增這些引數:
XHTML12 | android: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在使用上會更加方便,快捷