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

时间:2018-11-17 17:23:01

标签: android android-nestedscrollview

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

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

    });

我已经上网了,找不到解决方法。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

选项1(使用ScrollChangeListener)

一个选择可能是在scrollY中存储和比较oldScrollYscrollChangeListener的值。这样简单的方法可能会起作用(尽管尚未经过正式测试):

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的值。在我的代码中,需要以编程方式滚动到适配器类中的最后一个可见位置后,使recyclerView可见,而又不覆盖主类中的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);

}

*或多或少-必须考虑生命周期,但这与具体情况无关