目錄
概述
這是一個關於RecycleView滑動事件的輔助類,該輔助類可以檢測RecycleView滑動到頂部或者底部的狀態.
可用於實現RecycleView加載更多或者刷新(雖然刷新可以直接用SwipeRefreshLayout).也可用於某些滑動相關的需求,如FloatingActionButton的隱藏與顯示之類的.
關於RecycleView的滑動監聽
RecycleView本身已經提供了滑動的監聽接口,OnScrollListener,這個接口包含了以下的方法.
//當recycleView的滑動狀態改變時回調 public void onScrollStateChanged(RecyclerView recyclerView, int newState){} //當RecycleView滑動之后被回調 public void onScrolled(RecyclerView recyclerView,int dx, int dy){}
由以上狀態我們可以根據不同的狀態去判斷RecycleView當前的位置或者是滾動狀態.
關於滑動位置的監聽
我們需要確定的是RecycleView是否已經滑動到底部或者是頂部.
由以上提及的狀態我們可以確定,當前RecycleView滑動到頂部或者底部時,其滾動狀態都是靜止的,這時狀態應該是SCROLL_STATE_IDLE.
確定了狀態,下面需要確定的就是當前的item是否為頂部或者是底部的item?
關於這個問題,其實RecycleView已經有相關的方法可以查詢到了(嚴格來說應該是RecycleView的LayoutManager),網上已經有很多相關的博客說明.這里也是參考了一下一些博客,這里給出一個地址,可以了解一下,下面也會提及如何檢測,如果覺得鏈接內容太多可以跳過.
參考鏈接
特別說明,為了避免混亂
1.這里使用itemView表示adapter里每一個position對應的view;
2.position都是指adapter中的數據的位置
3.使用childView表示RecycleView緩存復用的子view
檢測邊界的itemView
關於itemView的位置確定,可以通過LinearLayoutManager獲取到當前顯示的view對應adapter中的position.
LinearLayoutManager linearManager = (LinearLayoutManager) layoutManager;
//查找最后一個可見的item的position int lastItemPosition = linearManager.findLastVisibleItemPosition(); //查找第一個可見的item的position int firstItemPosition =linearManager.findFirstVisibleItemPosition();
以上是簡單的頂部/底部判斷方式.
簡單判斷方式的缺點
以上已經介紹了如何判斷RecycleView滑動到頂部和底部的方式.但這個判斷方式是有缺陷的.問題在於RecycleView的可見itemView的查找上.
itemView的可見問題
RecycleView中的itemView是可大可小的,這個取決於我們的實際使用場景及業務.當itemView的內容比較多時,將會占據相當一部分RecycleView的界面.所以我們往往存在這種情況:
某些itemView會在滑動過程中只顯示一部分或者一半
但是這種情況下,該itemView還是屬於一個可見(visible).
任何時候一個itemView只要有任何一部分顯示在
RecycleView上時,該itemView都是可見的
回到我們之前查找邊界itemView的方法中,查找邊界用的方法是:
linearLayoutManager.findFirstVisibleItemPosition(
示例:當設置容差值為item的一半高度時,則在頂部或者底部item超過一半滑出界面時即可以觸發回調事件.
完整地檢測滿屏並滑動到底部(或者頂部)
將以上兩個檢測滿屏與檢測滑動到底部的方法組合起來即可.
最后附上更加具體的檢測方式:
- 可以設置先檢測滑動到底部還是頂部
- 可以設置在先檢測到某一種情況時是否還繼續檢測另一種情況(栽些情況下可能需要同時檢測是否滑動到頂部及底部)
- 可以設置是否檢測滿屏的情況(非滿屏情況下不觸發滑動事件)
- 可以設置檢測滑動到頂部/底部的容差值(即擴大檢測范圍)
GitHub地址
有幫助的話歡迎Start,謝謝
https://github.com/CrazyTaro/RecycleViewAdatper
資源下載
不想下載github項目的,或者不使用AS只需要類文件的,可以到以下下載地址直接下載類文件:
建議直接到github上下載文件,盡管這部分的文件功能很明確也很穩定,但如果項目有任何更新的情況下,肯定會提交到github上的.
http://download.csdn.net/detail/u011374875/9556686
