72

短い質問:

BoundaryCallbackページ+サイズを使用して新しいページとクラスをロードするAPIを使用して、アーキテクチャコンポーネントからページングライブラリでデータベース+ネットワークを処理する正しい方法は何ですか?

調査と説明

現在、アーキテクチャ コンポーネントのページング ライブラリで使用されるクラスBoundaryCallbackは、リスト内の要素のインスタンスをパラメータとして受け取りますが、この要素がどこにあるかという実際のコンテキストはありません。と で発生しonItemAtFrontLoadedますonItemAtEndLoaded

私の Api は、次のデータのチャンクをロードするために、ページとページのサイズを受け取ることになっています。ページ リスト ビルダーの一部として追加された境界コールバックは、プリフェッチ距離とページ サイズに基づいて、データの次のページをロードするタイミングを通知することになっています。

onItemAtFrontLoadedApi はページ番号とページのサイズを提供する必要があるため、とで提供されているリストから要素の 1 つを受け取るだけでは、それを Api に送信する方法がわかりませんonItemAtEndLoadedこのリンクの Google の例を確認すると、最後の要素の名前を使用して次の要素を取得しますが、ページ + サイズの Api には適合しません。

を使用するネットワークのみの別の例もありますがPagedKeyedDatasource、それをデータベースと BoundaryCallback と組み合わせる方法についてのサンプルや手がかりはありません。

編集:これまでに見つけた解決策は、最後に読み込まれたページを共有設定に保存することだけですが、それは汚いトリックのように聞こえます。

公式の意見については、 https://github.com/googlesamples/android-architecture-components/issues/252#issuecomment-392119468を参照して ください。

4

4 に答える 4

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;
}
于 2018-12-28T00:13:52.250 に答える