RecyclerView作為最常用的控件... 唉彬犯,最近真心累脓魏,本來計劃是每天一篇的...奈何太忙颤殴,先占個坑吧..這篇文章主要介紹RecycerView常見的效果,原理效少二拐,慢慢等吧(??`ω′?)
一服鹅、復雜布局
- 用GridLayoutManager.setSpanSizeLookup方法實現(xiàn).
getSpanSize(int position) 返回值特點 :假設初始GridLayoutManager時構造中傳入值為4,那么我們返回4的一半即(2/4)時顯示兩個條目卓鹿,返回可以整除的值時顯示一個條目菱魔,除不斷時則返回默認顯示條目數(shù)量.
利用條目類型加載不同的ViewHolder實現(xiàn)條目內容的不同,位置及數(shù)量的顯示則由getSpanSize的返回值決定.
缺點:條目類型越多ViewHolder就越多吟孙,RecyclerView內部的判斷就會越庸腫澜倦,如何將這些庸腫的判斷剔除出來呢聚蝶?
如何改進?
二藻治、下拉加載
下拉加載不同數(shù)據(jù)碘勉,首先要做的就是判斷條目位置,如何判斷條目位置呢桩卵?
三验靡、添加Head和Foot
在RecyclerView里添加頭和腳不難,因為頭與腳也可以看做成一種條目類型雏节,所以加頭加腳說白了也只是增加條目類型而以胜嗓,除此外還有一個問題,那便是如果將布局插入指定位置钩乍,好在RecyclerView也有提供相應的方法實現(xiàn).
面向過程的寫法:
面向對象的寫法:
考慮到在日后的工作中可能經常會遇到這樣的需求辞州,以硬編碼的方式實現(xiàn)該功能,無疑耦合度過高寥粹,以后用到時都需要更改相應的方法变过,因此最好是將加頭加腳的操作抽取出來。這里用裝飾設計模式.
- 裝飾設計模式:
四涝涤、拖拽
-
int getMovementFlags (RecyclerView , viewHolder):條目的移動方式.
onMove():某個條目的位置移動時調用媚狰,回調后應該將原來條目位置移動新位置.
onSwiped():某個條目滑動時調用,根據(jù)getMoementFlags方法的返回值決定是否調用阔拳,一但開始滑動則會調用clearView方法.
isLongPressDragEnabled():決定是否可以拖拽.
onSelectedChanged(ViewHolder, int):在每次View Holder的狀態(tài)變成拖拽 (ACTION_STATE_DRAG) 或者 滑動 (ACTION_STATE_SWIPE)的時候被調用崭孤。這是把你的item view變成激活狀態(tài)的最佳地點
clearView(RecyclerView, ViewHolder):在一個view被拖拽然后被放開的時候被調用,同時也會在滑動被取消或者完成ACTION_STATE_IDLE)的時候被調用衫生。這里是恢復item view idle狀態(tài)的典型地方裳瘪。
五、仿ViewPage
現(xiàn)在用RecyclerView實現(xiàn)ViewPage的橫向滾動很簡單罪针,官方提供了第三方的支持庫,我們只需要將RecyclerView將由此庫就可實現(xiàn)類似ViewPage的效果黄伊,代碼如下:
new LinearSnapHelper().attachToRecyclerView(recyclerView);
效果圖之所以會顯示兩邊的條目泪酱,是因為我并沒有將條目的寬度設置為match_parent
,如果你只想顯示單個條目只需要將寬度設置為match_parent
即可还最,同理若想條目之間有間隔只需設置layout_margin
屬性.
5.1墓阀、添加動畫效果
// ...
六、自定義ItemDecoration拓轻、ItemAnimator斯撮、LayoutManage
- LayoutManage
RecyclerView的緩存機制