Skip to content

Instantly share code, notes, and snippets.

@snadjafi
Last active February 21, 2017 05:38
Show Gist options
  • Save snadjafi/f327690457d97126cac7873cf2e9c45c to your computer and use it in GitHub Desktop.
Save snadjafi/f327690457d97126cac7873cf2e9c45c to your computer and use it in GitHub Desktop.
observable ScrollListener
subscription = scrollManager.getScrollObservable()
.distinctUntilChanged()
.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Integer totalCount) {
fetchNextPage();
}
});
public class RecyclerViewScrollManager {
//region Variables
private int totalItemCount;
private int lastVisibleItem;
private final int visibleThreshold;
private final PublishRelay<Integer> relay;
private RecyclerView recyclerView;
@Nullable private RecyclerView.OnScrollListener scrollListener;
//endregion
public RecyclerViewScrollManager(@NonNull RecyclerView recyclerView, int visibleThreshold) {
this.visibleThreshold = visibleThreshold;
this.recyclerView = recyclerView;
this.scrollListener = buildOnScrollListener((LinearLayoutManager) recyclerView.getLayoutManager());
this.recyclerView.addOnScrollListener(scrollListener);
relay = PublishRelay.create();
}
@NonNull
public PublishRelay<Integer> getScrollObservable() {
return relay;
}
@NonNull
private RecyclerView.OnScrollListener buildOnScrollListener(final LinearLayoutManager layoutManager) {
return 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);
totalItemCount = layoutManager.getItemCount();
lastVisibleItem = layoutManager.findLastVisibleItemPosition();
if (totalItemCount <= (lastVisibleItem + visibleThreshold)) {
relay.call(totalItemCount);
}
}
};
}
public void dispose() {
if (scrollListener != null) {
recyclerView.removeOnScrollListener(scrollListener);
}
recyclerView = null;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment