Android中Recyclerview监听是否滑动到底部
2018-02-03 09:41
405 查看
通过添加Recyclerview的OnScrollListener来判断Recyclerview是否滑动到底部。具体代码如下:
上面的代码基本上已经实现了对滑动到底部的监听,只需要将上面的Toast弹出提示的代码替换成我们自己的处理就可以了。但是上面的代码也有一个bug,当最后一个item刚显示出来的时候停止滑动这个时候也会触发滑动到底部的操作,有时候我们可能并不希望这,希望当Recyclerview确实是滑动到底部滑动不了的时候才触发。
上面的代码是在onScrolled的回调中获取layoutManager最后一个childView,获得childView的底部坐标和当前childView的position值,判断childView的底部坐标是否跟Recyclerview的底部坐标相等以及当前position是否是最后一个position值,如果都满足的话说明是真正的滑动到底部了。
注意:上面的判断是在onScrolled中书写的,每滑动一下都会去判断一次,也可以将这段代码放到onScrollStateChanged回调中当停止滑动的时候再去判断,类似于第一种方法那样。可以根据具体的业务需求进行修改
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { //当前RecyclerView显示出来的最后一个的item的position int lastPosition = -1; //当前状态为停止滑动状态SCROLL_STATE_IDLE时 if(newState == RecyclerView.SCROLL_STATE_IDLE){ RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); if(layoutManager instanceof GridLayoutManager){ //通过LayoutManager找到当前显示的最后的item的position lastPosition = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition(); }else if(layoutManager instanceof LinearLayoutManager){ lastPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition(); }else if(layoutManager instanceof StaggeredGridLayoutManager){ //因为StaggeredGridLayoutManager的特殊性可能导致最后显示的item存在多个,所以这里取到的是一个数组 //得到这个数组后再取到数组中position值最大的那个就是最后显示的position值了 int[] lastPositions = new int[((StaggeredGridLayoutManager) layoutManager).getSpanCount()]; ((StaggeredGridLayoutManager) layoutManager).findLastVisibleItemPositions(lastPositions); lastPosition = findMax(lastPositions); } //时判断界面显示的最后item的position是否等于itemCount总数-1也就是最后一个item的position //如果相等则说明已经滑动到最后了 if(lastPosition == recyclerView.getLayoutManager().getItemCount()-1){ Toast.makeText(RecyclerActivity.this, "滑动到底了", Toast.LENGTH_SHORT).show(); } } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { } });
//找到数组中的最大值 private int findMax(int[] lastPositions) { int max = lastPositions[0]; for (int value : lastPositions) { if (value > max) { max = value; } } return max; }
上面的代码基本上已经实现了对滑动到底部的监听,只需要将上面的Toast弹出提示的代码替换成我们自己的处理就可以了。但是上面的代码也有一个bug,当最后一个item刚显示出来的时候停止滑动这个时候也会触发滑动到底部的操作,有时候我们可能并不希望这,希望当Recyclerview确实是滑动到底部滑动不了的时候才触发。
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { //得到当前显示的最后一个item的view View lastChildView = recyclerView.getLayoutManager().getChildAt(recyclerView.getLayoutManager().getChildCount()-1); //得到lastChildView的bottom坐标值 int lastChildBottom = lastChildView.getBottom(); //得到Recyclerview的底部坐标减去底部padding值,也就是显示内容最底部的坐标 int recyclerBottom = recyclerView.getBottom()-recyclerView.getPaddingBottom(); //通过这个lastChildView得到这个view当前的position值 int lastPosition = recyclerView.getLayoutManager().getPosition(lastChildView); //判断lastChildView的bottom值跟recyclerBottom //判断lastPosition是不是最后一个position //如果两个条件都满足则说明是真正的滑动到了底部 if(lastChildBottom == recyclerBottom && lastPosition == recyclerView.getLayoutManager().getItemCount()-1 ){ Toast.makeText(RecyclerActivity.this, "滑动到底了", Toast.LENGTH_SHORT).show(); } } });
上面的代码是在onScrolled的回调中获取layoutManager最后一个childView,获得childView的底部坐标和当前childView的position值,判断childView的底部坐标是否跟Recyclerview的底部坐标相等以及当前position是否是最后一个position值,如果都满足的话说明是真正的滑动到底部了。
注意:上面的判断是在onScrolled中书写的,每滑动一下都会去判断一次,也可以将这段代码放到onScrollStateChanged回调中当停止滑动的时候再去判断,类似于第一种方法那样。可以根据具体的业务需求进行修改
相关文章推荐
- 通过重写OnScrollListener来监听RecyclerView是否滑动到底部
- Android RecyclerView滑动监听,判断是否滑动到了最后一个item
- 通过重写OnScrollListener来监听RecyclerView是否滑动到底部
- 通过重写OnScrollListener来监听RecyclerView是否滑动到底部
- android ScrollView嵌套ListView自动滑动到底部,嵌套ViewPager出现的滑动冲突以及监听滑动停止
- Android - NestedScrollView 内嵌 RecyclerView 滑动监听问题
- Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多
- Android——滑动监听RecyclerView线性流+左右划删除+上下移动
- Android 滑动监听RecyclerView线性流+左右划删除+上下移动
- Android Recyclerview或Viewpager判断是否已经到底部或者顶部(滑动冲突通用)
- Android监听WebView滑动到底部
- 从源码角度分析RecyclerView监听滑动到底部失效
- Android监听WebView滑动到底部
- Android监听WebView滑动到底部
- Android监听WebView滑动到底部
- Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多
- RecyclerView横向滑动监听,判断是否滑动到了最后一个Item
- webView监听是否滑动到底部
- RecyclerView滑动监听,判断是否滑动到了最后一个item
- nestedScrollview 嵌套使用recyclerview判断滑动到底部 (嵌套滑动导致 不能使用recyclerview的onscrolled监听)