分页库 - 带有API获取页面和大小的网络+数据库的边界回调

dro*_*dpl 58 android android-room android-livedata android-architecture-components android-paging

简短的问题:

使用使用页面大小加载新页面和BoundaryCallback类的API,从Architecture组件处理Paging库上的数据库+网络的正确方法是什么?

研究和解释

目前,BoundaryCallback在用于体系结构组件的分页库中使用的类接收列表中元素的实例作为参数,而没有该元素所在的实际上下文.它发生在onItemAtFrontLoadedonItemAtEndLoaded.

我的Api应该接收页面和页面大小以加载下一个数据块.作为分页列表构建器的一部分添加的边界回调应该告诉您何时根据预取距离和页面大小加载下一页数据.

由于API需要的页码和页面提供的尺寸,我看不到的方式发送到API只是通过接收从列表中提供的元素之一onItemAtFrontLoadedonItemAtEndLoaded.检查此链接中的google示例,他们使用最后一个元素的名称来获取下一个元素,但这不适合具有页面+大小的Api.

他们还有另一个只使用网络的例子PagedKeyedDatasource,但没有关于如何将它与数据库和BoundaryCallback混合的样本或线索.

编辑:到目前为止我找到的解决方案只是将最后加载的页面存储在共享首选项上,但这听起来像是一个肮脏的技巧.

有关官方输入,请参阅 https://github.com/googlesamples/android-architecture-components/issues/252#issuecomment-392119468.

小智 0

我实现这个:

PagedList.BoundaryCallback<Produto> boundaryCallbackNovidades = new PagedList.BoundaryCallback<Produto>(){
    int proxPagina;
    boolean jaAtualizouInicio=false;

    public void onZeroItemsLoaded() {
        requestProdutos(
            webService.pesquisarNovidadesDepoisDe(LocalDateTime.now().format(Util.formatterDataTime), 0, 20));
    }

    public void onItemAtFrontLoaded(@NonNull Produto itemAtFront) {
        if(!jaAtualizouInicio)
            requestProdutos(
                webService.pesquisarNovidadesMaisRecentesQue(itemAtFront.data.format(Util.formatterDataTime)));
        jaAtualizouInicio=true;
    }

    public void onItemAtEndLoaded(@NonNull Produto itemAtEnd) {
        requestProdutos(
            webService.pesquisarNovidadesDepoisDe(LocalDateTime.now().format(Util.formatterDataTime), proxPagina++, 20));
    }
};


public LiveData<PagedList<Produto>> getNovidades(){
    if(novidades==null){
        novidades = new LivePagedListBuilder<>(produtoDao.produtosNovidades(),
                10)
                .setBoundaryCallback(boundaryCallbackNovidades)
                .build();
    }
    return novidades;
}
Run Code Online (Sandbox Code Playgroud)