public class LockBottomScrollListener extends RecyclerView.OnScrollListener {
private LinearLayoutManager layoutManager;
private int lastVisibleItemPosition;
private boolean isLocked;
public LockBottomScrollListener(LinearLayoutManager layoutManager) {
this.layoutManager = layoutManager;
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
if (!isLocked && lastVisibleItemPosition >= layoutManager.getItemCount() - 1) {
recyclerView.setTouchListener(new View.OnTouchListener() {
private float initialY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
initialY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
if (event.getY() > initialY) {
isLocked = true;
return true;
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
isLocked = false;
break;
}
return false;
}
});
}
}
}
RecyclerView recyclerView = findViewById(R.id.recyclerview);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
recyclerView.addOnScrollListener(new LockBottomScrollListener(layoutManager));