RecyclerView滚动了UP/DOWN监听器

Lib*_*bin 41 java android onscrolllistener android-recyclerview

我们如何知道用户是向下滚动还是向上滚动RecyclerView

我尝试过RecyclerView#OnScrollListener,它给出了垂直滚动量和滚动状态.滚动状态空闲时,如何在开始拖动和滚动位置时获取最后一个滚动位置.

谢谢.

Rea*_*hed 84

接受的答案很好,但@MaciejPigulski在下面的评论中提供了更清晰,更整洁的解决方案.我只是把它作为答案在这里.这是我的工作代码.

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        if (dy > 0) {
            // Scrolling up
        } else {
            // Scrolling down
        }
    }

    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);

        if (newState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) {
            // Do something
        } else if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
            // Do something
        } else {
            // Do something
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 而不是使用`setOnScrollListener(...)`你可以使用`addOnScrollListener(...)` (12认同)
  • 它工作正常,但是当我尝试缓慢滚动时,滚动条在晃动,即缩小滚动条如何解决它? (2认同)
  • 最好不要使用条件 (dy > 0),因为如果 dy == 0 则意味着它不滚动,但在您的代码中它将被处理为“向下滚动”。我建议使用两个条件(dy > 0)和(dy < 0)来排除 0。 (2认同)

Xci*_*egn 32

试试这种方式:

private static int firstVisibleInListview;

firstVisibleInListview = yourLayoutManager.findFirstVisibleItemPosition();
Run Code Online (Sandbox Code Playgroud)

在您的滚动侦听器中:

public void onScrolled(RecyclerView recyclerView, int dx, int dy) 
{
    super.onScrolled(recyclerView, dx, dy);

    int currentFirstVisible = yourLayoutManager.findFirstVisibleItemPosition();

    if(currentFirstVisible > firstVisibleInListview)
       Log.i("RecyclerView scrolled: ", "scroll up!");
    else
       Log.i("RecyclerView scrolled: ", "scroll down!");  

    firstVisibleInListview = currentFirstVisible;

}
Run Code Online (Sandbox Code Playgroud)

  • `if(dy> 0){//向上滚动}否则{//向下滚动}`是不够的? (82认同)
  • @Maciej Pigulski dx和dy的问题是如果你慢慢滚动,dx和dy值是不可靠的.它应该适用于大多数应用程序,但如果您想要精确,答案中给出的方式更好. (6认同)
  • 每次向下滚动都会被调用。为什么 ? (3认同)

Sha*_*war 12

如果向下滚动recyclerview,我想隐藏布局,然后如果向上滚动回收器视图则使其可见.我做了一些思考,想出了这个逻辑.变量y是全局静态int.不要忘记宣布y为static int y;

我希望它有助于某人:)

 mRecyclerView.addOnScrollListener(new EndlessRecyclerOnScrollListener(lLayout) {
           @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            // super.onScrolled(recyclerView, dx, dy);
                y=dy;
            }

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if(mRecyclerView.SCROLL_STATE_DRAGGING==newState){
                    //fragProductLl.setVisibility(View.GONE);
                }
                if(mRecyclerView.SCROLL_STATE_IDLE==newState){
                   // fragProductLl.setVisibility(View.VISIBLE);
                    if(y<=0){
                        fragProductLl.setVisibility(View.VISIBLE);
                    }
                    else{
                        y=0;
                        fragProductLl.setVisibility(View.GONE);
                    }
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)


Him*_*ani 5

另一个可以在适配器的帮助下检测滚动方向的简单解决方案:

class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyViewHolder> {
    int lastItemPosition = -1;

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        if (position > lastItemPosition) {
            // Scrolled Down
        }
        else {
            // Scrolled Up
        }
        lastItemPosition = position;
     }
}
Run Code Online (Sandbox Code Playgroud)

^ 在滚动时进行项目动画时很有帮助。

PS:这会不连续地告诉你方向,直到进一步调用 onBindViewHolder 。