recyclerview.setOnScrollListener()
或者 recyclerview.addOnScrollListener()
set方法將會被棄用 deprecated 最好使用add方法但是這個也可以根據自己情況,如果自己當前的api中set方法沒有被棄用,不存在add方法。就只能使用set方法了。
監聽 上滑,下滑
這些都不是重點,接下來就分析如何監聽,RecyclerView的滑動。
RecyclerView.OnScrollListener中有一個方法 叫 onScrolled()
public void onScrolled(RecyclerView recyclerView, int dx, int dy){}
其中dx,dy分別表示 在x方向和y方向滑動的值,這個值有正負。
如果 dx>0
則表示 右滑 , dx<0
表示 左滑 dy <0
表示 上滑, dy>0
表示下滑
通過這幾個參數就可以監聽 滑動方向的狀態。
監聽 頂部,底部
但是還有兩種情況,不能通過 dx,dy直接判斷出來。那就是 頂部 top狀態,底部 bottom狀態。需要借助一些其他參數,結合來判斷。
第一種方法
第一種方法,在ListView中也經常使用,就是 firstvisibleItem , visibleItemCount,totalItemCount。 也就是 當前屏幕 首個 可見的 Item 的position,當前屏幕 可見的 Item 個數,Item總共的個數。
private boolean loading = true; int pastVisiblesItems, visibleItemCount, totalItemCount; mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { visibleItemCount = mLayoutManager.getChildCount(); totalItemCount = mLayoutManager.getItemCount(); pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition(); if (loading) { if ( (visibleItemCount + pastVisiblesItems) >= totalItemCount) { // 判斷點 loading = false; Log.v("...", "Last Item Wow !"); } } } });
判斷的依據就在 代碼注釋的地方,通過比較上面三個參數來判斷
如果 當前 第一個可見item的位置
+ 當前可見的item個數
>= item的總個數
這樣就可以判斷出來,是在底部了,bottom。
同理,可以通過第一個可見的item的位置來判斷 是否在 頂部 top。
loading只是一個flag 用來避免重復加載。
第二種方法
通過View的滑動屬性來判斷,是否在頂部,或者底部。這種方法的實現非常簡便。
通過重寫 OnScrollListener來判斷。
public abstract class OnVerticalScrollListener extends RecyclerView.OnScrollListener { @Override public final void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (!recyclerView.canScrollVertically(-1)) { onScrolledToTop(); } else if (!recyclerView.canScrollVertically(1)) { onScrolledToBottom(); } else if (dy < 0) { onScrolledUp(); } else if (dy > 0) { onScrolledDown(); } } public void onScrolledUp() {} public void onScrolledDown() {} public void onScrolledToTop() {} public void onScrolledToBottom() {} }
這個方法利用了View的一個方法。public boolean canScrollVertically (int direction)
這個方法是判斷View在豎直方向是否還能 向上,向下 滑動。
根據上面的例子,應該可以看出。 -1 表示 向上, 1 表示向下。
同理還有 public boolean canScrollHorizontally (int direction)
方法用來判斷 水平方向的滑動。 具體的使用方法可以參考 官方文檔
實現這個自定義的Listener之后你就可以在RecycyclerView的setOnScrollListener方法中使用了,像系統的使用方法一樣。