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;
            }
        });
    }
}

Дополнительная информация:

  1. repository.requestFetch () запрашивает определенную страницу у веб-сервиса, и там ответ будет вставлен в базу данных (Room). Если ответ предназначен для первой страницы, то все старые данные будут удалены перед вставкой новых данных.

  2. repository.getCurrentList () возвращает DataSource.Factory, созданный dao базы данных

Проблема в том, что когда я обновляю список, переменные в BoundaryCallback не обновляются, то есть "currentPage" продолжает увеличиваться и не сбрасывается до 1 (когда очевидно, что новый BoundaryCallback создается с каждым вызовом initPagedList). В любом случае я не знаю, что мне здесь не хватает, любая помощь будет оценена.

0 ответов