19

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

我有一个ArticlesRepository类,它返回一个包含我想在 RecyclerView 中显示的ArticleList实例的类。ArticleListItem文章列表已经在服务器上进行了分页,因此存储库发送一个对第一页的请求,并返回一个属性设置为和属性包含所请求页面上的文章ArticleList的属性。我不知道一页能写多少篇文章。page1articlesList<ArticleListItem>

现在,我能够实现 a 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 的工作而我只是做错了什么?感谢您的任何建议。

4

1 回答 1

30

分页库应该自动知道何时加载新项目。您的实现中的问题是分页的 RecyclerView 在 NestedScrollView 内,根据这个问题,库没有内置支持。

当您将 recyclerview 放在无限滚动的父级中时,它将布局其所有子级,因为父级提供无限维度。

您需要创建自己的嵌套滚动视图实现,在这个要点中实际上有一个可以帮助您。

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

android:fillViewport="true" 到可滚动容器

于 2018-07-05T18:47:01.097 回答