您的位置:首页 > 运维架构

RecyclerView 滑动检测 (上滑 up)(下滑 down)(顶部 top)(底部 bottom)

2015-10-19 17:29 489 查看
RecyclerView 给我们的可以检测滑动事件的接口 只有 一个方法

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方法中使用了,像系统的使用方法一样。

参考链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息