【问题标题】:NestedScrollView setOnScrollChangeListener api 21NestedScrollView setOnScrollChangeListener api 21
【发布时间】:2018-09-24 16:50:27
【问题描述】:

大家好,我正在尝试处理 recyclerView 中的 onScrolled 事件,该事件位于 NestedScrollView 中。

到目前为止,我找到了setOnScrollChangeListener,但是这个方法是 API 23,我的目标是 API 21,有什么想法可以在 API 21 中处理这个问题吗?

【问题讨论】:

    标签: android android-recyclerview android-nestedscrollview onscrolllistener


    【解决方案1】:

    我认为您将 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");
                }
            }
        });
    

    【讨论】:

      【解决方案2】:

      您可以使用 API 23 下面的 ViewTreeObserver#addOnScrollChangedListener() 来实现:

      mRecylerview.getViewTreeObserver().addOnScrollChangedListener(
          new ViewTreeObserver.OnScrollChangedListener() {
            @Override public void onScrollChanged() {
                int x = toolbar.getScrollX();
                int y = toolbar.getScrollY();
            }
          });
      

      【讨论】:

      • 我在一个片段中,知道如何从片段中获取 Y 吗?
      【解决方案3】:

      一段时间后我有了一个想法,我已经停止在RecyclerView 上收听滚动并开始收听NestedScrollView onScroll 事件。

      我设法使用这个 sn-p 使我的 loadOnDemand 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

      【讨论】:

        【解决方案4】:

        感谢 Kotlin 中的@NhatVM:

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

        【讨论】:

          猜你喜欢
          • 2017-11-10
          • 2016-11-03
          • 1970-01-01
          • 2015-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-27
          • 2015-05-15
          相关资源
          最近更新 更多