清單的滾動一般分為兩種:
手指按下 -> 手指拖拽清單移動 -> 手指停止拖拽 -> 擡起手指
手指按下 -> 手指快速拖拽後擡起手指 -> 清單繼續滾動 -> 停止滾動
從上面可以看出,滾動狀态分為:
上面的過程的狀态變化如下:
靜止 -> 被迫拖拽移動 -> 靜止
靜止 -> 被迫拖拽移動 -> 自己滾動 -> 靜止
<!--more-->
好了,我們分析完滾動的過程,再看看如何監聽RecyclerView的滾動.檢視源碼是最好的方法.
檢視RecyclerView的源碼,我們可以看到以下代碼:
也就是說有兩種方式可以監聽滾動事件:
<code><code>其中 setOnScrollListener 已經過時(<code> 設定的監聽器源碼如下:</code></code></code>
在滾動過程中,此監聽器會回調兩個方法.
onScrollStateChanged : 滾動狀态變化時回調 onScrolled : 滾動時回調
這兩者的差別在于: 狀态與過程
注 : 以下源碼可在最後的位址中找到.
以上代碼中輸出了主要個幾個資訊:
newState : 目前的狀态
dx : 水準滾動距離
dy : 垂直滾動距離
在<code></code>
recyclerView : 目前在滾動的RecyclerView
newState : 目前滾動狀态.
其中newState有三種值:
recyclerView : 目前滾動的view
運作以上代碼,然後按照上面的滾動過程分别進行兩種滾動.
第一種方式緩慢滾動結果如下:
第二種快速滾動結果如下:
且在滾動過程中發現:
1.滾動方向
dy > 0 時為向上滾動 dy < 0 時為向下滾動
2.回調過程
緩慢拖拽回調過程:
快速滾動回調過程:
3.頂端與底部
以上資訊中還列印了<code></code>
<code><code>RecyclerView.canScrollVertically(-1)</code>的值表示是否滾動到頂部</code>
基于以上,我們可以封裝一個可以回調滾動狀态和方向的RecyclerView.
先建立事件監聽的接口<code><code>public interface OnScrollCallback { voidonStateChanged(ScrollRecycler recycler, int state); voidonScrollUp(ScrollRecycler recycler, int dy); voidonScrollDown(ScrollRecycler recycler, int dy); }</code></code>
<code>再寫一個類<code>RecyclerView</code>,在類中添加以下方法:</code>
本文轉自 一點點征服 部落格園部落格,原文連結:http://www.cnblogs.com/ldq2016/p/6645952.html,如需轉載請自行聯系原作者