目前很多项目里都使用Recyclerview来做开发了,但是对于Recyclerview不是很了解可能会遇到各种问题,下面就对怎样判断Recyclerview中的最后一个item做判断!
- 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) {
-
- }
-
- });
findMax方法:
- //找到数组中的最大值
- private int findMax(int[] lastPositions) {
- int max = lastPositions[0];
- for (int value : lastPositions) {
- if (value > max) {
- max = value;
- }
- }
- return max;
- }
通过添加对RecyclerView的滑动事件,在滑动状态改变的回调里当滑动停止的时候通过layout找到当前RecyclerView显示的最后一个item的position,然后判断这个position是否为Recyclerview的最后一个item的position值,如果是的话则表示已经滑动到最底部了。
上面的代码基本上已经实现了对滑动到底部的监听,只需要将上面的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();
- }
- }
-
- });
当最后一个item的高度放不下的时候需要使用下面的方法来做判断。
//获取最后一个完全显示的ItemPosition
int lastVisibleItem = lineanrManager.findLastCompletelyVisibleItemPosition();
int totalItemCount =
lineanrManager.getItemCount();