私は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のジョブであり、何か間違っているのですか?アドバイスありがとうございます。
ページングライブラリは、新しい項目をいつロードするかを自動的に認識する必要があります。実装の問題は、ページングされたRecyclerViewがNestedScrollViewの内部にあり、これによると issue ライブラリはそのサポートを組み込んでいないことです。
無限スクロールの親の内部にrecyclerviewを配置すると、親が無限の次元を提供するため、すべての子がレイアウトされます。
ネストされたスクロールビューの独自の実装を作成する必要があります。実際には、ここに1つあります Gist が役立つ可能性があります。
このカスタムネストされたスクロールビューにfillViewPortを追加することもお勧めします。
Android:fillViewport = "true"からスクロール可能なコンテナー