NestedScrollView的setOnScrollChangeListener API 21

12
大家好,我正在尝试处理位于嵌套滚动视图(NestedScrollView)内的RecyclerView的onScrolled事件。
到目前为止,我已经找到了setOnScrollChangeListener方法,但是这种方法需要API 23,而我正在针对API 21,有什么办法可以解决这个问题吗?
4个回答

25

我认为您正在使用setOnChangeScrollListener与View.OnScrollChangeListener。请改用NestedScrollView.OnScrollChangeListener,如下所示:

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

            Log.e("ProductFragment","position button " + topPositionButton + " scrollY " + scrollY);
            if(scrollY > oldScrollY){
                Log.e("ProductFragment","down");
            }
            else{
                Log.e("ProductFragment","up");
            }
        }
    });

比较嵌套滚动视图和OnScrollChangeListener视图的图片


3
您可以使用ViewTreeObserver#addOnScrollChangedListener()在api 23以下实现此目标:
mRecylerview.getViewTreeObserver().addOnScrollChangedListener(
    new ViewTreeObserver.OnScrollChangedListener() {
      @Override public void onScrollChanged() {
          int x = toolbar.getScrollX();
          int y = toolbar.getScrollY();
      }
    });

我在一个片段内部,有什么办法可以从片段中获取Y吗? - guisantogui

3

经过一段时间的思考,我想到了一个主意,停止监听RecyclerView上的滚动事件,开始监听NestedScrollView上的onScroll事件。

使用以下代码片段,我成功地实现了我的recyclerView的按需加载功能。

    nsv_posts_timeline.setOnScrollChangeListener(
            NestedScrollView.OnScrollChangeListener {
                                _, scrollX, scrollY, _, oldScrollY ->

        if(scrollY > oldScrollY){
            val totalItens = timelineAdapter.itemCount

            val currentView = rv_timeline.findChildViewUnder(scrollX.toFloat(), scrollY.toFloat())
            val childPosition = rv_timeline.getChildAdapterPosition(currentView)

            if((totalItens/2) - (stepSize/2) <= childPosition && !isLoading){
                isLoading = true
                                          //skip , take
                timelinePresenter.loadMore(totalItens, 5)
            }
        }
    })

isLoading 是一个类属性,当我的回调函数从服务器返回时我会将其改为 false。


0

感谢 Kotlin 中的 @NhatVM:

scrollView.setOnScrollChangeListener(
    NestedScrollView.OnScrollChangeListener { nestedScrollView, scrollX, scrollY, oldScrollX, oldScrollY ->
        // ...
    }
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接