Skip to content

Instantly share code, notes, and snippets.

@amitshekhariitbhu
Last active September 21, 2019 03:29
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save amitshekhariitbhu/6cb4bf591a9f5a8fad9852d126b1abea to your computer and use it in GitHub Desktop.
Save amitshekhariitbhu/6cb4bf591a9f5a8fad9852d126b1abea to your computer and use it in GitHub Desktop.
public class PaginationActivity extends AppCompatActivity {
// removed for brevity..
private PublishProcessor<Integer> paginator = PublishProcessor.create();
private ProgressBar progressBar;
private boolean loading = false;
private int pageNumber = 1;
private final int VISIBLE_THRESHOLD = 1;
private int lastVisibleItem, totalItemCount;
@Override
protected void onCreate(Bundle savedInstanceState) {
// removed for brevity...
paginationAdapter = new PaginationAdapter();
recyclerView.setAdapter(paginationAdapter);
setUpLoadMoreListener();
subscribeForData();
}
/**
* setting listener to get callback for load more
*/
private void setUpLoadMoreListener() {
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView,
int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
totalItemCount = layoutManager.getItemCount();
lastVisibleItem = layoutManager
.findLastVisibleItemPosition();
if (!loading
&& totalItemCount <= (lastVisibleItem + VISIBLE_THRESHOLD)) {
pageNumber++;
paginator.onNext(pageNumber);
loading = true;
}
}
});
}
/**
* subscribing for data
*/
private void subscribeForData() {
Disposable disposable = paginator
.onBackpressureDrop()
.doOnNext(page -> {
loading = true;
progressBar.setVisibility(View.VISIBLE);
})
.concatMapSingle(page -> dataFromNetwork(page)
.subscribeOn(Schedulers.io())
.doOnError(throwable -> {
// handle error
})
// continue emission in case of error also
.onErrorReturn(throwable -> new ArrayList<>()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(items -> {
paginationAdapter.addItems(items);
paginationAdapter.notifyDataSetChanged();
loading = false;
progressBar.setVisibility(View.INVISIBLE);
});
compositeDisposable.add(disposable);
paginator.onNext(pageNumber);
}
//removed for brevity...
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment