3.1 初始化
創(chuàng)建VirtualLayoutManager對象,與RecycleView綁定
//創(chuàng)建VirtualLayoutManager對象VirtualLayoutManager layoutManager=newVirtualLayoutManager(activity);recyclerView.setLayoutManager(layoutManager);
3.2 設置回收復用池
//設置回收復用池大小,(如果一屏內相同類型的 View 個數(shù)比較多,需要設置一個合適的大小,防止來回滾動時重新創(chuàng)建 View)RecyclerView.RecycledViewPool viewPool=newRecyclerView.RecycledViewPool();recyclerView.setRecycledViewPool(viewPool);viewPool.setMaxRecycledViews(0,20);
3.3 設置RecycleView適配器
設置 V - Layout的Adapter有兩種方式:
定義:DelegateAdapter是V - Layout專門為管理 LayoutHelper定制的 Adapter
繼承自VirtualLayoutAdapter
作用:通過管理不同布局的Adapter勾拉,繼而管理不同的 LayoutHelper,從而實現(xiàn)使用不同組合布局
特別注意:雖不可直接綁定LayoutHelper,但是它內部有一個繼承自RecyclerView.Adapter的內部類Adapter可以綁定LayoutHelper噩死;
即通過一個List把綁定好的Adapter打包起來颤难,再放去DelegateAdapter,這樣就可以實現(xiàn)組合使用不同的布局
具體做法:
```
//設置適配器DelegateAdapterdelegateAdapter=newDelegateAdapter(layoutManager,true);recyclerView.setAdapter(delegateAdapter
publicclassBaseDelegateAdapterextendsDelegateAdapter.Adapter<BaseViewHolder>{
privateLayoutHelpermLayoutHelper;privateintmCount=-1;privateintmLayoutId=-1;privateContextmContext;privateintmViewTypeItem=-1;protectedBaseDelegateAdapter(Contextcontext,LayoutHelperlayoutHelper,intlayoutId,intcount,intviewTypeItem){this.mContext=context;this.mCount=count;this.mLayoutHelper=layoutHelper;this.mLayoutId=layoutId;this.mViewTypeItem=viewTypeItem;}@OverridepublicLayoutHelperonCreateLayoutHelper(){returnmLayoutHelper;}@OverridepublicBaseViewHolderonCreateViewHolder(ViewGroupparent,intviewType){if(viewType==mViewTypeItem){returnnewBaseViewHolder(LayoutInflater.from(mContext).inflate(mLayoutId,parent,false));}returnnull;}@OverridepublicvoidonBindViewHolder(BaseViewHolderholder,intposition){}/**
? ? * 必須重寫不然會出現(xiàn)滑動不流暢的情況
? ? */@OverridepublicintgetItemViewType(intposition){returnmViewTypeItem;}//條目數(shù)量@OverridepublicintgetItemCount(){returnmCount;}}
```
子LayoutHelper
* 定義:MarginLayoutHelper 的第二層具體實現(xiàn)
* 作用:負責具體的布局邏輯
? ? * 每種 子LayoutHelper 負責一種布局邏輯
? ? * 重點實現(xiàn)了 beforeLayout()已维、doLayout()乐严、afterLayout()
? ? * 特別是 doLayout():會獲取一組件,并對組件進行尺寸計算衣摩、界面布局
? ? * V - Layout 默認實現(xiàn)了10種默認布局:(對應同名的LayoutHelper)
* 特別注意:
? ? * 每一種 LayoutHelper 負責布局一批組件范圍內的組件昂验,不同組件范圍內的組件之間,如果類型相同艾扮,可以在滑動過程中回收復用既琴。因此回收粒度比較細,且可以跨布局類型復用.
? ? * 支持擴展外部:即注冊新的 LayoutHelper泡嘴,實現(xiàn)特殊的布局方式甫恩。下面會詳細說明
相關屬性介紹
5.1 LayoutHelper方法說明
* 5.1.1 margin,padding * Margin,padding就是外邊距、內邊距 * 它不是整個RecyclerView頁面的margin和padding酌予,它是每一塊LayoutHelper所負責的區(qū)域的margin和padding磺箕。 * 一個頁面里可以有多個LayoutHelper,意味著不同LayoutHelper可以設置不同的margin和padding抛虫。 * LayoutHelper的margin和padding與頁面RecyclerView的margin和padding可以共存松靡。 * 目前主要針對非fix類型的LayoutHelper實現(xiàn)了margin和padding,fix類型LayoutHelper內部沒有相對位置關系建椰,不處理邊距雕欺。* 5.1.2 dividerHeight * LinearLayoutHelper的屬性,LinearLayoutHelper是像ListView一樣的線性布局棉姐,dividerHeight就是每個組件之間的間距屠列。* 5.1.3 aspectRatio * 為了保證布局過程中視圖的高度一致,我們設計了aspectRatio屬性伞矩,它是寬與高的比例笛洛,LayoutHelper里有aspectRatio屬性,通過vlayout添加的視圖的LayoutParams也有aspectRatio屬性乃坤,后者的優(yōu)先級比前者高苛让,但含義不一樣。 * LayoutHelper定義的aspectRatio侥袜,指的是一行視圖整體的寬度與高度之比蝌诡,當然整體的寬度是減去了RecyclerView和對應的LayoutHelper的margin,padding。 * 視圖的LayoutParams定義的aspectRatio枫吧,指的是在LayoutHelper計算出視圖寬度之后浦旱,用來確定視圖高度時使用的,它會覆蓋通過LayoutHelper的aspectRatio計算出來的視圖高度九杂,因此具備更高優(yōu)先級颁湖。* 5.1.4 bgColor,bgImg * 背景顏色或者背景圖宣蠕,這其實不是布局屬性,但是由于在vlayout對視圖進行了直接布局甥捺,不同區(qū)域的視圖的父節(jié)點都是RecyclerView抢蚀,如果想要針對某一塊區(qū)域單獨繪制背景,就很難做到了镰禾。vlayout框架對此做了特殊處理皿曲,對于非fix、非float類型的LayoutHelper吴侦,支持配置背景色或背景圖屋休。同樣目前主要針對非fix類型的LayoutHelper實現(xiàn)這個特性。* 5.1.5 weights * ColumnLayoutHelper,GridLayoutHelper的屬性备韧,它們都是提供網格狀的布局能力劫樟,建議使用GridLayoutHelper,它的能力更加強大织堂,參考下文介紹叠艳。默認情況下,每個網格中每一列的寬度是一樣的易阳,通過weights屬性附较,可以指定讓每一列的寬度成比例分配,就像LinearLayout的weight屬性一樣闽烙。 weights屬性是一個float數(shù)組翅睛,每一項代表某一列占父容器寬度的百分比,總和建議是100黑竞,否則布局會超出容器寬度;如果布局中有4列疏旨,那么weights的長度也應該是4很魂;長度大于4,多出的部分不參與寬度計算檐涝;如果小于4遏匆,不足的部分默認平分剩余的空間。 * 比如谁榜,setweights(0.6,0.2,0.2);那么分配比例是3:1:1 * 5.1.6 vGap,hGap * GridLayoutHelper與StaggeredGridLayoutHelper都有這兩個屬性幅聘,分別控制視圖之間的垂直間距和水平間距。 * 5.1.7 spanCount,spanSizeLookup * GridLayoutHelper的屬性窃植,參考于系統(tǒng)的GridLayoutManager帝蒿,spanCount表示網格的列數(shù),默認情況下每一個視圖都占用一個網格區(qū)域巷怜,但通過提供自定義的spanSizeLookUp葛超,可以指定某個位置的視圖占用多個網格區(qū)域 * 5.1.8 autoExpand * GridLayoutHelper的屬性暴氏,當一行里視圖的個數(shù)少于spanCount值的時候,如果autoExpand為true绣张,視圖的總寬度會填滿可用區(qū)域答渔;否則會在屏幕上留空白區(qū)域。 * 5.1.9 lane * StaggeredGridLayoutHelper中有這個屬性侥涵,與GridLayoutHelper里的spanCount類似沼撕,控制瀑布流的列數(shù)。
5.2 fix類型的LayoutHelper方法說明
* 5.2.1 fixAreaAdjuster
? ? * fix類型的LayoutHelper芜飘,在可能需要設置一個相對父容器四個邊的偏移量端朵,比如整個頁面里有一個固定的標題欄添加在vlayout容器上,vlayout內部的fix類型視圖不希望與外部的標題有所重疊燃箭,那么就可以設置一個fixAreaAdjuster來做偏移冲呢。
* 5.2.2 alignType, x, y
? ? * FixLayoutHelper, ScrollFixLayoutHelper, FloatLayoutHelper的屬性,表示吸邊時的基準位置招狸,有四個取值敬拓,分別是TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT。x和y是相對這四個位置的偏移量裙戏,最終的偏移量還要受上述的fixAreaAdjuster影響乘凸。
? ? ? ? * TOP_LEFT:基準位置是左上角,x是視圖左邊相對父容器的左邊距偏移量累榜,y是視圖頂邊相對父容器的上邊距偏移量营勤;
? ? ? ? * TOP_RIGHT:基準位置是右上角,x是視圖右邊相對父容器的右邊距偏移量壹罚,y是視圖頂邊相對父容器的上邊距偏移量葛作;
? ? ? ? * BOTTOM_LEFT:基準位置是左下角,x是視圖左邊相對父容器的左邊距偏移量猖凛,y是視圖底邊相對父容器的下邊距偏移量赂蠢;
? ? ? ? * BOTTOM_RIGHT:基準位置是右下角,x是視圖右邊相對父容器的右邊距偏移量辨泳,y是視圖底邊相對父容器的下邊距偏移量虱岂;
* 5.2.3 showType
? ? * ScrollFixLayoutHelper的屬性,取值有SHOW_ALWAYS, SHOW_ON_ENTER, SHOW_ON_LEAVE菠红。
? ? ? ? * SHOW_ALWAYS:與FixLayoutHelper的行為一致第岖,固定在某個位置;
? ? ? ? * SHOW_ON_ENTER:默認不顯示視圖,當頁面滾動到這個視圖的位置的時候,才顯示舟茶;
? ? ? ? * SHOW_ON_LEAVE:默認不顯示視圖钥勋,當頁面滾出這個視圖的位置的時候顯示蕊肥;
* 5.2.4 stickyStart, offset
? ? * StickyLayoutHelper的屬性滑潘,當視圖的位置在屏幕范圍內時诗舰,視圖會隨頁面滾動而滾動蔓罚;當視圖的位置滑出屏幕時杠纵,StickyLayoutHelper會將視圖固定在頂部(stickyStart = true)或者底部(stickyStart = false)荠耽,固定的位置支持設置偏移量offset。
http://www.reibang.com/p/363ed30a5d53
https://blog.csdn.net/qq_35414752/article/details/79479848? 詳細