RecyclerView 的滾動事件
滾動事件的分類
列表的滾動分類一般分為兩種
- 手指按下 ----> 手指拖動列表移動-----> 手指停止拖拽 -----> 抬起手指
- 手指按下 ----> 手指快熟拖拽后抬起手指 ----> 列表繼續(xù)滾動 ----> 停止?jié)L動
上面的過程狀態(tài)變化如下 :
- 靜止---->被迫拖拽移動---->靜止
- 靜止---->被迫拖拽移動----> 自己滾動---->靜止
監(jiān)聽 RecyclerView的滾動
有兩種方式可以監(jiān)聽滾動事件:
1括丁、setOnScrollListener (OnScrollListener listener)
2茧吊、addOnScrollListener (OnScrollListener listener)
其中 setOnScrollListener (OnScrollListener listener) 由于有可能出現(xiàn)空指針異常的風(fēng)險(xiǎn) 沼撕,已經(jīng)過時(shí)。建議用 addOnScrollListener躬它。
OnScrollListener
OnScrollListener 類是個(gè)抽象類,有兩個(gè)方法:
void onScrollStateChange(RecyclerView recyclerView , int newState) // 滾動狀態(tài)變化時(shí)回調(diào)
void onScrolled(RecyclerView recyclerView ,int dx,int dy) // 滾動時(shí)回調(diào)
onScrollStateChange(RecyclerView recyclerView , int newState) 方法
回調(diào)的兩個(gè)變量的含義:
RecycleView : 當(dāng)前在滾動的RecyclerView
newState : 當(dāng)前滾動的狀態(tài)
其中 newState 有三種值:
/**
* The recyclerView is not currently scrolling. () 靜止沒有滾動
*/
public static final int SCROLL_STATE_IDLE = 0;
/**
* The recyclerView is currently being dragged by outside input such as user touch input.
* (正在被外部拖拽,一般為用戶正在手指滾動)
*/
public static final int SCROLL_STATE_DRAGGING = 1;
/**
* The recyclerView is currently animating to a final poistion while not under outside control.
* (自動滾動)
*/
public static final int SCROLL_STATE_SETTLING = 2;
onScrollListener(RecyclerView recyclerView, int dx, int dy) 方法
回調(diào)的三個(gè)變量含義:
recyclerView : 當(dāng)前滾動的view
dx : 水平滾動距離
dy : 垂直滾動距離
dx > 0 時(shí)為手指向左滾動,列表滾動顯示右面的內(nèi)容
dx < 0 時(shí)為手指向右滾動,列表滾動顯示左面的內(nèi)容
dy > 0 時(shí)為手指向上滾動,列表滾動顯示下面的內(nèi)容
dy < 0 時(shí)為手指向下滾動,列表滾動顯示上面的內(nèi)容
canScrollVertically和canScrollHorizontally方法
public boolean canScrollVertically(int direction)
//這個(gè)方法是判斷view在豎直方向是否還能向上、向下滑動
//其中赛不,direction 為 -1 表示手指向下滑動(屏幕向上滑動),1 表示手指向上滑動(屏幕向下滑動)罢洲。
public boolean canScrollHorizontally (int direction)
//這個(gè)方法用來判斷 水平方向的滑動
兩種判斷是否到底部的方法
方法一:
如果當(dāng)前第一個(gè)可見item的位置 + 當(dāng)前可見的item個(gè)數(shù) >= item的總個(gè)數(shù)這樣就可以判斷出來踢故,是在底部了。
通過visibleItemCount + pastVisiblesItems) >= totalItemCount
來判斷是否是底部惹苗。
方法二:
通過 canScrollVertically 來判斷
loadingMoreListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if(!loading && !recyclerView.canScrollVertically(1)){
loading = true;
loadMoreDate();
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
// if (dy > 0) //向下滾動
// {
// int visibleItemCount = mLinearLayoutManager.getChildCount();
// int totalItemCount = mLinearLayoutManager.getItemCount();
// int pastVisiblesItems = mLinearLayoutManager.findFirstVisibleItemPosition();
//
// if (!loading && (visibleItemCount + pastVisiblesItems) >= totalItemCount) {
// loading = true;
// loadMoreDate();
// }
// }
}