Android Paging Library 是如何知道加载更多数据的?

How does Android Paging Library know to load more data?

我对开发 Android 应用程序还很陌生,我正在努力以“正确的方式”做所有事情。所以现在,我正在我的项目中实施新的 Android 分页库,我需要从网络服务器加载文章列表。

我有一个 ArticlesRepository class,return 是一个 ArticleList class,其中包含我想显示的 ArticleListItem 的实例在 RecyclerView 中。文章列表已经在服务器上分页,因此存储库发送对第一页的请求,并且 returns 一个 ArticleList page 属性 设置为 1articles 属性 包含请求页面上的 List<ArticleListItem> 篇文章。不知道一页能放多少文章

现在,我能够实现 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 函数 return 带有 previous/next 页码的 Integernull 如果没有。

在我的 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 库没有内置支持。

when you put recyclerview inside an infinite scrolling parent, it will layout all of its children because the parent provides infinite dimensions.

您需要创建自己的嵌套滚动视图实现,gist 中实际上有一个可能对您有所帮助。

还建议将 fillViewPort 添加到此自定义嵌套滚动视图:

android:fillViewport="true" to scrollable container