【问题标题】:RecyclerView OnScrollStateChanged() and onScrolled()RecyclerView OnScrollStateChanged() 和 onScrolled()
【发布时间】:2016-11-12 09:32:06
【问题描述】:

我的问题是,我们可以从onScrollStateChanged() 方法调用RecyclerViewonScrolled() 方法吗?原因是我想检查两个条件。如果SCROLL_STATE_SETTLING 为真,则检查用户是否向下滚动。有没有其他方法可以检查他们俩?

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

            if (newState == RecyclerView.SCROLL_STATE_SETTLING) {

              // Now I have to check if the user has scrolled down or up.  

            }
        }

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


        }
    });

【问题讨论】:

  • 您想要实现的任何目标都可以在 onscrillstatechanged 中完成。提供更多细节,以便我知道如何做到这一点
  • 完成。当 newState == RecyclerView.SCROLL_STATE_SETTLING 时,我想检查用户是否向下滚动。

标签: android android-recyclerview


【解决方案1】:
【解决方案2】:

这是你想要的吗?

通过onScrolled 方法,您可以通过检查dy 是否小于0 来设置布尔标志“isScrolledDown”,以了解用户向下滚动。然后只要滚动状态为SCROLL_STATE_SETTLINGisScrolledDown 为真,则执行您想要的操作。

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

        private boolean isScrolledDown = false;

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

            if (newState == RecyclerView.SCROLL_STATE_SETTLING && isScrolledDown) {

              // Do something...

            }
        }

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

            isScrolledDown = dy < 0;
        }
    });

【讨论】:

    【解决方案3】:

    你可以先在你的监听器之外声明这两个变量

    //chose appropriate initial values
      var updatedRange = Range(...) 
      var lastVisibilityRange = Range(...)
    

    然后在侦听器回调中,您将拥有如下内容:

    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                        super.onScrolled(recyclerView, dx, dy)
    
                        val first = manager.findFirstVisibleItemPosition()
                        val last = manager.findLastVisibleItemPosition()
                        lastVisibilityRange = updatedRange
                        updatedRange = Range(first , last)
    
                        //or you can even call this section in onScrollStateChanged 
                        if (updatedRange.lower <= lastVisibilityRange.lower) {
                            //has scrolled up
                        } else {
                            //has scrolled down
                        }
    
                    }
    
    

    该代码尚未经过测试,您可以通过在其中添加 LiveData 使其更具反应性,如果这不是您要查找的内容,请随时告诉我,希望这对您有所帮助或指出朝着正确的方向,祝大家有个美好的一天。

    【讨论】:

      猜你喜欢
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      相关资源
      最近更新 更多