web-dev-qa-db-ja.com

Android Paging Libraryはどのようにしてより多くのデータをロードすることを知っていますか?

私はAndroidアプリを開発するのはかなり新しいです。私はすべてを「正しい方法」で実行しようとしています。それで、今、私は新しいAndroidページングライブラリをプロジェクト。ネットワークサーバーから記事のリストを読み込む必要があります。

RecyclerViewに表示したいArticlesRepositoryのインスタンスを含むArticleListクラスを返すArticleListItemクラスがあります。記事のリストは既にサーバー上でページ分割されているため、リポジトリは最初のページのリクエストを送信し、ArticleListプロパティを1に設定してpageを返し、articlesプロパティには、リクエストされたページの記事のList<ArticleListItem>が含まれます。 1ページにいくつの記事を掲載できるかわかりません。

今、PageKeyedDataSource<Integer, ArticleListItem>を実装することができましたが、最初のページしかフェッチしません:

@Override
public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull LoadInitialCallback<Integer, ArticleListItem> callback) {
    ArticleList list = load(1);
    if (list != null) {
        callback.onResult(list.articles, null, next(list));
    }
}

@Override
public void loadBefore(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, ArticleListItem> callback) {
    ArticleList list = load(previous(params.key));
    if (list != null) {
        callback.onResult(list.articles, previous(list));
    }
}

@Override
public void loadAfter(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, ArticleListItem> callback) {
    ArticleList list = load(next(params.key));
    if (list != null) {
        callback.onResult(list.articles, next(list));
    }
}

previous/next関数は、前/次のページ番号とともにIntegerを返します。ページ番号がない場合はnullを返します。

私のViewModelでは、PagedListを次のように構成します。

PagedList.Config config = new PagedList.Config.Builder()
            .setEnablePlaceholders(false)
            .setInitialLoadSizeHint(1)
            .setPageSize(1)
            .setPrefetchDistance(1)
            .build();

このようにして最初のページをロードできますが、RecyclerViewの下部(つまりNestedScrollViewの内側)までスクロールしても何も起こりません。デバッグは、PageKeyedDataSource.loadAfterメソッドが呼び出されていないことを示しています。

次のページをロードする必要があることをどういうわけかPagedListに通知する必要がありますか、それともRecyclerView/DataSource/GodKnowsWhatElseのジョブであり、何か間違っているのですか?アドバイスありがとうございます。

14
Jacob

ページングライブラリは、新しい項目をいつロードするかを自動的に認識する必要があります。実装の問題は、ページングされたRecyclerViewがNestedScrollViewの内部にあり、これによると issue ライブラリはそのサポートを組み込んでいないことです。

無限スクロールの親の内部にrecyclerviewを配置すると、親が無限の次元を提供するため、すべての子がレイアウトされます。

ネストされたスクロールビューの独自の実装を作成する必要があります。実際には、ここに1つあります Gist が役立つ可能性があります。

このカスタムネストされたスクロールビューにfillViewPortを追加することもお勧めします。

Android:fillViewport = "true"からスクロール可能なコンテナー

14
Levi Moreira