RecyclerView onScrollStateChanged()和onScrolled()

时间:2016-11-12 09:32:07

标签: android android-recyclerview

我的问题是,我们可以从RecyclerView方法调用onScrolled()的{​​{1}}方法。原因是我想检查两个条件。如果onScrollStateChanged()为真,则检查用户是否向下滚动。还有其他方法来检查它们吗?

SCROLL_STATE_SETTLING

3 个答案:

答案 0 :(得分:0)

This is image to show query results

答案 1 :(得分:0)

这是您想要的吗?

通过onScrolled方法,您可以通过检查dy是否小于0来知道该用户已向下滚动,来设置布尔标志'isScrolledDown'。然后,只要滚动状态为SCROLL_STATE_SETTLING并且isScrolledDown为真,就执行所需的操作。

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;
        }
    });

答案 2 :(得分:0)

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

//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 使其更具反应性,如果这不是您要找的内容,请随时告诉我,希望这会有所帮助或为您指明正确的方向,祝大家有个美好的一天。