如何检查 NestedScrollView 当前是否正在滚动?

How do I check if NestedScrollView is currently scrolling?

我有一个 NestedScrollView,我想查看它正在滚动的天气。

nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
        @Override
        public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {}

    });

我上网查了一下,没找到解决方法。

为此,您必须编写扩展 NestedScrollView 的自定义视图,并在该视图中覆盖 onScrollChange() 方法并在该方法中添加日志以获取滚动值,您正在编写自定义视图因为您无法将日志添加到系统小部件。

选项 1(使用 ScrollChangeListener)

一个选项可能是在 scrollChangeListener 中存储和比较 scrollYoldScrollY 值。像这样简单的东西可能会起作用(尽管还没有经过正式测试):

private boolean scrollHasBeenChecked = false;
    
    nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
        @Override
        public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
            
            
            if(!scrollHasBeenChecked) {

                scrollHasBeenChecked = true;
                int scrollDif = scrollY - oldScrollY;
                
                final Handler handler0 = new Handler(Looper.getMainLooper());
                handler0.postDelayed(new Runnable() {
                    @Override
                    public void run() {

                        if(scrollDif == scrollY - oldScrollY) {
                            
                            //Proceed
                            
                        } else {

                            scrollHasBeenChecked = false;
                            
                        }

                    }
                    //Adjust accordingly
                }, 250);
                
            }
            
        }

    });

选项 2(没有 ScrollChangeListener)

根据您的具体情况,您可以交叉检查 scrollY 值。在我的代码中,我需要在编程滚动到我的适配器 class 中的最后一个可见位置后使我的 recyclerView 可见,而不覆盖我的主 class 中的 scrollChangeListener。如果我的 nestedScrollView.getScrollY() == lastVisiblePosition(检查延迟可运行循环),则它不再滚动*。基于这个概念的通用解决方案可能会像这样工作:

final Handler handler = new Handler(Looper.getMainLooper());
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {

           int y = nestedScrollView.getScrollY();
           
           checkIfStillScrolling(y);

        }
        //Pick an appropriate delay time or replace runnable with some equivalent checking mechanism
    }, 1000);


private void checkIfStillScrolling(final int y) {

    final Handler handler = new Handler(Looper.getMainLooper());
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {

            if(y = nestedScrollView.getScrollY()){

                //Next step goes here

            } else {

                checkIfStillScrolling(y);

            }

        }
        //Pick an appropriate loop delay time
    }, 100);

}

*或多或少 - 必须考虑生命周期,但这与此无关