public class RecycleViewScrollListener extends RecyclerView.OnScrollListener {
public static final int SCROLL_TOP = 1;
public static final int SCROLL_CENTER = 0;
public static final int SCROLL_BOTTOM = -1;
@Orientation
private int orientation;
private OnScrollStateListener mOnScrollStateListener;
private OnScrollPositionListener mOnScrollPositionListener;
private OnScrollDirectionListener mOnScrollDirectionListener;
public RecycleViewScrollListener(@Orientation int orientation) {
this.orientation = orientation;
}
public void setOnScrollStateListener(OnScrollStateListener listener) {
this.mOnScrollStateListener = listener;
}
public void setOnScrollPositionListener(OnScrollPositionListener listener) {
this.mOnScrollPositionListener = listener;
}
public void setOnScrollDirectionListener(OnScrollDirectionListener listener) {
this.mOnScrollDirectionListener = listener;
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
if (mOnScrollStateListener != null) {
mOnScrollStateListener.scrollState(recyclerView.getScrollState() != 0);
}
if (mOnScrollPositionListener != null) {
if (orientation == LinearLayoutManager.VERTICAL) {
if (!recyclerView.canScrollVertically(-1)) {
mOnScrollPositionListener.scrollPosition(SCROLL_TOP);
} else if (!recyclerView.canScrollVertically(1)) {
mOnScrollPositionListener.scrollPosition(SCROLL_BOTTOM);
} else {
mOnScrollPositionListener.scrollPosition(SCROLL_CENTER);
}
} else {
if (!recyclerView.canScrollHorizontally(-1)) {
mOnScrollPositionListener.scrollPosition(SCROLL_TOP);
} else if (!recyclerView.canScrollHorizontally(1)) {
mOnScrollPositionListener.scrollPosition(SCROLL_BOTTOM);
} else {
mOnScrollPositionListener.scrollPosition(SCROLL_CENTER);
}
}
}
if (mOnScrollDirectionListener != null) {
if (dy < 0) {
mOnScrollDirectionListener.scrollUp(dy);
} else if (dy > 0) {
mOnScrollDirectionListener.scrollDown(dy);
}
}
}
public interface OnScrollStateListener {
void scrollState(boolean isScrolling);
}
public interface OnScrollPositionListener {
void scrollPosition(int position);
}
public interface OnScrollDirectionListener {
void scrollUp(int dy);
void scrollDown(int dy);
}
@IntDef({LinearLayoutManager.VERTICAL, LinearLayoutManager.HORIZONTAL})
@Retention(RetentionPolicy.SOURCE)
public @interface Orientation {
}
}