Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RecyclerView onScrollChangeListener

I need to hide and show a floating action button while I scroll up and down a RecyclerView, I have implemented this successfully under SDK 23, code shown below (newReminder is the button I need to hide and show):

recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
    super.onScrollStateChanged(recyclerView, newState);
}

@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
    super.onScrolled(recyclerView, dx, dy);

    if (scrolledDistance > HIDE_THRESHOLD && !newReminder.isMenuButtonHidden()) {
        newReminder.hideMenuButton(true);
        scrolledDistance = 0;
    } else if (scrolledDistance < -HIDE_THRESHOLD && newReminder.isMenuButtonHidden()) {
        newReminder.showMenuButton(true);
        scrolledDistance = 0;
    }

    if((!newReminder.isMenuButtonHidden() && dy>0) || (newReminder.isMenuButtonHidden() && dy<0)) {
        scrolledDistance += dy;
    }
}

});

However, for SDK 23, when I use onScrollChangeListener I got confused with the parameters, my code below does not work any more:

if(Build.VERSION.SDK_INT > 22){
recyclerView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
    @Override
    public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) 
        if (scrolledDistance > HIDE_THRESHOLD && !newReminder.isMenuButtonHidden()) {
            newReminder.hideMenuButton(true);
        } else if (scrolledDistance < -HIDE_THRESHOLD && newReminder.isMenuButtonHidden()) {
            newReminder.showMenuButton(true);
        }
        if((!newReminder.isMenuButtonHidden() && scrollY > 0)
                || (newReminder.isMenuButtonHidden() && scrollY < 0)) {
            scrolledDistance = oldScrollY - scrollY;
        }
    }
});

}

I think I misunderstood what it meant by scrollY and oldScrollY, can anyone help me? Thanks!!!

like image 485
TPWang Avatar asked Dec 24 '22 13:12

TPWang


1 Answers

setOnScrollChangeListener(OnScrollChangeListener l) is the wrong replacement of deprecated method setOnScrollListener(OnScrollListener listener).

Use addOnScrollListener(OnScrollListener) and removeOnScrollListener(OnScrollListener) instead. These methods take the same OnScrollListener as a parameter, so you do not have to worry about changes in your logic. The only difference from previous implementation is that now you can add more than one listener to a RecyclerView.

Here is a link to the documentation

like image 74
DmitryArc Avatar answered Jan 12 '23 19:01

DmitryArc