7
homeViewModel.pagingDataFlow.subscribe(expensesPagingData -> {
                expenseAdapter.submitData(getLifecycle(), expensesPagingData);    
            }, throwable -> Log.e(TAG, "onCreate: " + throwable.getMessage()));

// ViewModel

 private void init() {
        pagingDataFlow = homeRepository.init();
        CoroutineScope coroutineScope = ViewModelKt.getViewModelScope(this);
        PagingRx.cachedIn(pagingDataFlow, coroutineScope);

    }

// Repository 
    public  Flowable<PagingData<ExpensesModel>> init() {
            // Define Paging Source
            expensePagingSource = new ExpensePagingSource(feDataService);
            // Create new Pager
            Pager<Integer, ExpensesModel> pager = new Pager<Integer, ExpensesModel>(
                    
                    new PagingConfig(10,
                            10,
                            false, 
                            10, 
                            100),
                    () -> expensePagingSource); // set paging source
    
            // inti Flowable
            pagingDataFlow = PagingRx.getFlowable(pager);
            return pagingDataFlow;
        }


I have tried to invalidate still not working.
 public void invalidatePageSource() {
        if (expensePagingSource != null) {
            expensePagingSource.invalidate();
        }
    }

当使用expenseAdapter.refresh() 刷新适配器 时,当Pager 期望创建一个新实例时,重新使用了一个PagingSource 实例。确保传递给 Pager 的 pagingSourceFactory 总是返回一个新的 PagingSource 实例。 这是我用来获取数据的可流动对象。

任何帮助将不胜感激。

4

4 回答 4

5

所以而不是

val pagingSource = PagingSource()

return Pager() {
   pagingSource
}.flow

用这个


return Pager() {
   PagingSource()
}.flow

基本上,它有助于存储分页资源的引用,稍后当您调用 refresh() 时,适配器会使用该引用对其调用无效。

于 2022-01-11T13:04:40.973 回答
1

我的代码有类似的问题,我发现这个问题对我有帮助。

Pager 的分页源工厂 lambda 必须始终返回源的新实例。在您的情况下,它总是返回您在init()方法中创建的实例。

尝试将其更改为:

Pager<Integer, ExpensesModel> pager = new Pager<Integer, ExpensesModel>(
                
                new PagingConfig(10,
                        10,
                        false, 
                        10, 
                        100),
                () -> {new ExpensePagingSource(feDataService)});
于 2021-04-17T10:38:13.713 回答
0

应该创建新的 pagingSource 实例

Pager(
      config = PagingConfig(...),
      pagingSourceFactory = {
                PagingSource()// new instance
            }
      ).flow.cachedIn(viewModelScope)

如果没有任何效果,可以尝试 3.0.0-alpha01 版本的分页(不推荐)

于 2021-11-30T11:49:33.577 回答
0

您需要使用InvalidatingPagingSourceFactory链接)。它包含invalidate()使每个PagingSource已分派的无效的方法。

在你的代码中是这样的:

    // Repository 
    InvalidatingPagingSourceFactory invalidatingFactory = 
        InvalidatingPagingSourceFactory {
            new ExpensePagingSource(feDataService);
        }
    public  Flowable<PagingData<ExpensesModel>> init() {
            // Create new Pager
            Pager<Integer, ExpensesModel> pager = new Pager<Integer, ExpensesModel>(
                    
                    new PagingConfig(
                            10,
                            10,
                            false, 
                            10, 
                            100),
                            invalidatingFactory); // set paging source
    
            // inti Flowable
            pagingDataFlow = PagingRx.getFlowable(pager);
            return pagingDataFlow;
        }


 public void invalidatePageSource() {
        invalidatingFactory.invalidate();
    }
于 2022-02-01T11:08:46.090 回答