Last active
September 21, 2019 03:29
-
-
Save amitshekhariitbhu/6cb4bf591a9f5a8fad9852d126b1abea to your computer and use it in GitHub Desktop.
This file contains 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 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