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

时间:2018-07-05 18:24:55

标签: java android android-recyclerview android-viewmodel android-paging

我对开发Android应用程序还很陌生,我想以“正确的方式”做所有事情。所以,现在,我将新的Android Paging Library实施到我的项目中,在这里我需要从网络服务器加载一系列文章

我有一个ArticlesRepository类,它返回一个ArticleList类,其中包含要在RecyclerView中显示的ArticleListItem的实例。文章列表已在服务器上分页,因此存储库发送对第一页的请求,并返回ArticleList属性page设置为1且{{1} }属性,其中包含articles个在所请求页面上的文章。我不知道一页上可以有多少篇文章。

现在,我能够实现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,如果没有则返回Integer

在ViewModel中,我像这样配置PagedList:

null

通过这种方式,我可以加载第一页,但是当我滚动到RecyclerView的底部(位于NestedScrollView内部)时,什么也没发生。调试显示未调用PagedList.Config config = new PagedList.Config.Builder() .setEnablePlaceholders(false) .setInitialLoadSizeHint(1) .setPageSize(1) .setPrefetchDistance(1) .build(); 方法。

我是否必须以某种方式告诉PagedList必须加载下一页,还是RecyclerView / DataSource / GodKnowsWhatElse的工作,我只是做错了什么?感谢您的任何建议。

1 个答案:

答案 0 :(得分:7)

分页库应该自动知道何时加载新项目。实现中的问题是分页的RecyclerView位于NestedScrollView中,并且根据此issue,该库没有对此的内置支持。

  

当您将recyclerview放入无限滚动父级中时,它将   布局所有子项,因为父项提供无限   尺寸。

您需要创建自己的Nested Scroll View实现,此gist中实际上有一个可以帮助您的实现。

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

  

android:fillViewport =“ true”到可滚动容器