RecyclerView VS ListView

小夥伴們,RecyclerView和ListView我們在項目中經常使用;

我們來對這兩個控件做一些對比,希望對我們以後兩個控件的選取有一定的幫助:

RecyclerView概述:

RecyclerView 集成自 ViewGroup;

RecyclerView是Android-support-V7版本中新增的一個Widgets;

官方對於它的介紹是:RecyclerView是ListView的升級版本,更加先進和靈活。

Android L 之後,Google 提供了RecyclerView視圖化控件,5.0之前如果想要使用的話,可以添加V7包以向下兼容,提供更全面的API和更靈活的佈局管理。

RecyclerView有哪些特點:

· 類似ListView

· 類似GridView

· 橫向ListView

· 橫向GridView

· 瀑布流佈局

RecyclerView組成:

· RecyclerView.LayoutManager

· RecyclerView.Recyler

· RecyclerView.Adapter

· RecyclerView.ViewHolder

· RecyclerView.ItemDecoration

· RecyclerView.ItemAnimator

機制:

layoutmanager 從Recycle 中獲取已經綁定數據的 Item 顯示,並將不再需要的Item 丟給Recycler 回收;

Adapter 負責生成新Item 並將其綁定好數據,供Recyle獲取;Recycler 就是子 Item 的一個緩存池。

RecyclerView.LayoutManager -- 管理子View佈局的一個組件:

佈局子視圖、滾動子視圖在滾動過程中根據子視圖在佈局中所處的位置,決定何時添加子視圖和刪除子視圖。

涉及到的API:

(1)、獲取佈局尺寸

setRecyclerView()、setMeasureSpecs()、                setMeasuredDimensionFromChildren()

(2)、可以設置和獲取方向的水平或垂直

canScrollHorizontally()、canScrollVertically()、      setOrientation()、    getOrientation()

(3)、滑動狀態改變時RecyclerView調用方法通知LayoutManager

onScrollStateChanged(()

(4)、增、刪、移動子View

addView()、removeView()、moveView()、removeAllViews()、    removeViewAt()

(5)、獲取指定位置的View

getPosition()、getChildAt()、findViewByPosition()

(6)、獲取可見子View及全部子View的個數

getChildCount()、getItemCount()

(7)、移除數據後調用了recycler進行數據的緩存

detachView()、detachAndScrapAttachedViews()、removeAndRecycleAllViews()、scrapOrRecycleView()

RecyclerView.Adapter 負責數據、Item的生成和數據的綁定:

Adapter 有幾個抽象方法需要子類實現:

(1)、返回一個ViewHolder 封裝實例

onCreateViewHolder()

(2)、根據ViewHolder對應的View進行數據綁定

onBindViewHolder()

(3)、獲取總數

getItemCount()

(4)、獲取不同Type類型的View,爲添加 header 和 footer 預留接口

getItemViewType()

(5)、指定位置的 item 內容發生了變化

notifyItemChanged()

(6)、在指定的位置處插入一個 Item

notifyItemInserted()

(7)、指定位置的兩個 Item 進行交換

notifyItemMoved(int, int)

RecyclerView.Recyler 負責 Item 的緩存:

即提供新的,也回收舊的(強大就強大在View的循環回收利用)

RecyclerView 的二級緩存:

有兩個緩存:Scrap 和 Recycle ,Scrap 中文是廢料的意思。Recycle 對應是回收的意思。

Scrap 緩存是指裏面緩存的View 是接下來需要用到的,不需要新綁定數據,是一個輕量級的緩存集合,而Recycle 的緩存的 View 爲裏面的數據需要重新綁定,都放在RecyclerViewPool 池中,都需要通過 Adapter 重新綁定數據。

RecyclerView 緩存的兩種方式:

Detach 和 Remove ,Detach 的View 放在Scrap 緩存中,Remove 掉的View 放在 RecyclerViewPool緩存池中。

使用場景:

反覆去將View移除並且馬上又要添加進去時,選擇Detach 方式,通過方法 detachAndScrapView()實現。

使用頻率很低,屏幕中不顯示的時候使用Remove 的方式,通過方法 removeAndRecycleView()實現。

複用流程:

當我們去獲取一個新的View時,首先去檢查Scrap 緩存是否有對應的 position 的View ;

如果有直接用;如果沒有,則從RecyclerViewPool緩存池中取,並且會回調Adapter 的onBindViewHolder 方法(如果Recycle 緩存爲空,還會調用onCreateViewHolder方法),最後再將綁定好新數據的View返回。

Recycler相關方法:

(1)、獲取緩存最大閥值,閥值爲2

setItemViewCacheSize()

(2)、從緩存中取Item

getViewForPosition()

(3)、獲取Scrap 緩存列表

getScrapList()

(4)、從Layoutmanager 回收Item

recyclerView()

(5)、回收後,緩存類型的內部處理邏輯

recyclerViewHolderInternal()

(6)、根據Adapter 變化,轉換Item 緩存如pool

onAdapterChanged()

(7)、調用此方法返回一個RecyclerViewPool 實例

getRecyclerView()

(8)、緩存如pool

addViewHolderToRecyclerViewPool()

RecyclerViw 與 listView 比較:

Item 回收/複用方面:

後者是以convertView 作爲回收單位,需要手動添加ViewHolder ,而前者則是以ViewHolder作爲回收單位,convertView 被內置到了ViewHolder 中作爲 ViewHolder 的成員變量,前者內置了Recycle 、多級緩存。

樣式豐富方面:

前者通過支持水平、垂直和變革列表及其他更復雜形式,而後者只支持具體某一種

效果增強方面:

前者內置了ItemDecoration 和 ItemAnimator ,可以自定義繪製 itemView 之間的一些特殊UI 或Item 項數據變化時的動畫效果,而yoga後者實現比較麻煩。

代碼內聚方面:

前者將功能密切相關的類攜程內部類,如ViewHolder,Adapter。而後者沒有。

具體兩個控件的使用代碼俺就不貼了,

文中有錯的話,可留言指出哦!

RecyclerView VS ListView

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章