我尝试编写以下代码
@Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if(dy > 0){ //scrolling up } else { //scrolling down int pastVisibleItems = linearLayoutManager.findFirstVisibleItemPosition(); if (pastVisibleItems == 0) { Toast.makeText(getContext(),"Top most item",Toast.LENGTH_SHORT).show(); } } }
但它不起作用.我也尝试使用android的SwipeRefreshLayout来做这个,因为它做了我想要的,它能够检测用户何时滚动到最顶层的项目.我决定不使用它,因为我似乎无法阻止加载指示器弹出(我不想看到加载指示器出来).
所以,基本上我想做的是:
检查用户滚动
它已经是最顶级的项目了吗?
如果是的话,执行一些事情,如果没有则执行任务
知道怎么做到这一点?
谢谢.
将您的代码替换为以下代码:
@Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); int pastVisibleItems = linearLayoutManager.findFirstCompletelyVisibleItemPosition(); if (pastVisibleItems == 0) { Toast.makeText(getContext(),"Top most item",Toast.LENGTH_SHORT).show(); } }
它对我有用,如果您遇到任何错误,请发表评论。
我自己解决了我的问题.我使用下面的代码
private boolean isUserScrolling = false; private boolean isListGoingUp = true;
然后在RecyclerView OnScrollListener中
@Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); //detect is the topmost item visible and is user scrolling? if true then only execute if(newState == RecyclerView.SCROLL_STATE_DRAGGING){ isUserScrolling = true; if(isListGoingUp){ //my recycler view is actually inverted so I have to write this condition instead if(linearLayoutManager.findLastCompletelyVisibleItemPosition() + 1 == list.size()){ Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { if(isListGoingUp) { if (linearLayoutManager.findLastCompletelyVisibleItemPosition() + 1 == list.size()) { Toast.makeText(getContext(),"exeute something", Toast.LENGTH_SHORT).show(); } } } },50); //waiting for 50ms because when scrolling down from top, the variable isListGoingUp is still true until the onScrolled method is executed } } } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if(isUserScrolling){ if(dy > 0){ //means user finger is moving up but the list is going down isListGoingUp = false; } else{ //means user finger is moving down but the list is going up isListGoingUp = true; } } }