天天看點

RecyclerView的滾動事件分析

清單的滾動一般分為兩種:

手指按下 -> 手指拖拽清單移動 -> 手指停止拖拽 -> 擡起手指

手指按下 -> 手指快速拖拽後擡起手指 -> 清單繼續滾動 -> 停止滾動

從上面可以看出,滾動狀态分為:

上面的過程的狀态變化如下:

靜止 -> 被迫拖拽移動 -> 靜止

靜止 -> 被迫拖拽移動 -> 自己滾動 -> 靜止

<!--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 &gt; 0 時為向上滾動 dy &lt; 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,如需轉載請自行聯系原作者

繼續閱讀