小夥伴們,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。而後者沒有。
具體兩個控件的使用代碼俺就不貼了,
文中有錯的話,可留言指出哦!