PagedList.BoundaryCallback не обновляется в DB + Network
Я новичок в Android Paging (не стреляйте в меня), и я пытаюсь реализовать Paging с базой данных и сетью, как образец Android.
Я наблюдаю getPagedList() моей ViewModel во фрагменте, и там я отправляю список своему адаптеру, например:
public class MyFragment extends Fragment{
...
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
refreshLayout.setOnRefreshListener(this::requestRefresh);
myViewModel.getPagedList().observe(this, myList -> {
myAdapter.submitList(myList);
});
}
private void requestRefresh(){
if (myAdapter != null && myAdapter.getCurrentList() != null) {
myAdapter.getList().getDataSource().invalidate();
}
myViewModel.requestRefresh(this);
}
}
Вот моя ViewModel и как я создаю свой PagedList:
public class MyViewModel extends ViewModel {
...
@Inject
public MyViewModel(MyRepository repository) {
this.repository = repository;
initPagedList();
}
private void initPagedList() {
DataSource.Factory<Integer, MyModel> factory = repository.getCurrentList();
PagingBoundaryCallback boundaryCallback = new PagingBoundaryCallback();
PagedList.Config config = (new PagedList.Config.Builder())
.setPageSize(10)
.setInitialLoadSizeHint(20)
.build();
mPagedList = new LivePagedListBuilder<>(factory, config)
.setBoundaryCallback(boundaryCallback)
.build();
}
public LiveData<PagedList<MyModel>> getPagedList() {
return mPagedList;
}
public void requestRefresh() {
initPagedList();
}
}
И вот мой BoundaryCallback:
public class PagingBoundaryCallback extends PagedList.BoundaryCallback<MyModel> {
private MyRepository repository;
private boolean isLoading = false;
private boolean allItemsAreLoaded = false;
private int currentPage = 1;
public PagingBoundaryCallback() {
repository = MyApplication.getInstance().getAppComponent().MyRepository();
}
@Override
public void onZeroItemsLoaded() {
allItemsAreLoaded = false;
currentPage = 1;
requestFetch(1);
}
@Override
public void onItemAtEndLoaded(@NonNull MyModel itemAtEnd) {
if (!isLoading && !allItemsAreLoaded){
requestFetch(currentPage);
}
}
private void requestFetch(int page) {
isLoading = true;
repository.requestFetch(page, new FinishCallback() {
@Override
public void onFinish(List<MyModel> myList) {
currentPage++;
isLoading = false;
if (myList.size() == 0)
allItemsAreLoaded = true;
}
@Override
public void onError(String message) {
isLoading = false;
}
});
}
}
Дополнительная информация:
repository.requestFetch () запрашивает определенную страницу у веб-сервиса, и там ответ будет вставлен в базу данных (Room). Если ответ предназначен для первой страницы, то все старые данные будут удалены перед вставкой новых данных.
repository.getCurrentList () возвращает DataSource.Factory, созданный dao базы данных
Проблема в том, что когда я обновляю список, переменные в BoundaryCallback не обновляются, то есть "currentPage" продолжает увеличиваться и не сбрасывается до 1 (когда очевидно, что новый BoundaryCallback создается с каждым вызовом initPagedList). В любом случае я не знаю, что мне здесь не хватает, любая помощь будет оценена.