RecyclerView OnScrollStateChanged() 和 onScrolled()

问题描述 投票:0回答:3

我的问题是,我们可以从

RecyclerView
方法中调用
onScrolled()
onScrollStateChanged()
方法吗?原因是我想检查两个条件。如果
SCROLL_STATE_SETTLING
为 true,则检查用户是否已向下滚动。还有其他方法可以检查两者吗?

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


        }
    });
android android-recyclerview
3个回答

0
投票

这是你想要的吗?

onScrolled
方法中,您可以通过检查
dy
是否小于 0 来设置布尔标志“isScrolledDown”,以了解用户向下滚动。然后每当滚动状态为
SCROLL_STATE_SETTLING
并且
isScrolledDown
为 true 时,就执行你想要的操作。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.