8

Hello folks I'm trying to handle an onScrolled event in my recyclerView, that's inside a NestedScrollView.

So far, I have found setOnScrollChangeListener, however this method is API 23, and I'm targeting API 21, any idea to handle this issue back in API 21?

guisantogui
  • 3,608
  • 6
  • 45
  • 83

3 Answers3

17

I think you are using setOnChangeScrollListener with View.OnScrollChangeListener. Please use NestedScrollView.OnScrollChangeListener like that:

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

image compare NestedScrollview and View OnScrollChangeListener

NhatVM
  • 1,182
  • 9
  • 19
3

You can achieve that using ViewTreeObserver#addOnScrollChangedListener() below api 23:

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

After some time I got an idea, I've stopped listening to scroll on RecyclerView and started listening to NestedScrollView onScroll event.

I managed to make my loadOnDemand recyclerView using this snippet

    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 is a class property that I change to false when my callback returns from server

guisantogui
  • 3,608
  • 6
  • 45
  • 83