Last active
February 21, 2017 05:38
-
-
Save snadjafi/f327690457d97126cac7873cf2e9c45c to your computer and use it in GitHub Desktop.
observable ScrollListener
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
}); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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