先看效果圖:

滑動(dòng)監(jiān)聽.gif
//設(shè)置RecyclerView滑動(dòng)監(jiān)聽器 addOnScrollListener(),其中setOnScrollListener()方法已過時(shí)
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//獲得recyclerView的線性布局管理器
LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
//獲取到第一個(gè)item的顯示的下標(biāo) 不等于0表示第一個(gè)item處于不可見狀態(tài) 說明列表沒有滑動(dòng)到頂部 顯示回到頂部按鈕
int firstVisibleItemPosition = manager.findFirstVisibleItemPosition();
// 當(dāng)不滾動(dòng)時(shí)
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
// 判斷是否滾動(dòng)超過一屏
if (firstVisibleItemPosition == 0) {
ivTop.setVisibility(View.GONE);
} else {
//顯示回到頂部按鈕
ivTop.setVisibility(View.VISIBLE);
}
//獲取RecyclerView滑動(dòng)時(shí)候的狀態(tài)
} else if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {//拖動(dòng)中
ivTop.setVisibility(View.GONE);
}
}
});
RecyclerView有三個(gè)滑動(dòng)狀態(tài):
- 當(dāng)前的recycleView不滑動(dòng)(滑動(dòng)已經(jīng)停止時(shí))
public static final int SCROLL_STATE_IDLE = 0;
- 當(dāng)前的recycleView被拖動(dòng)滑動(dòng)
public static final int SCROLL_STATE_DRAGGING = 1;
- 當(dāng)前的recycleView在滾動(dòng)到某個(gè)位置的動(dòng)畫過程,但沒有被觸摸滾動(dòng).調(diào)用 scrollToPosition(int) 應(yīng)該會(huì)觸發(fā)這個(gè)狀態(tài)
public static final int SCROLL_STATE_SETTLING = 2;