我是开发Android应用程序的新手,我正在尝试以"正确的方式"做所有事情.所以现在,我正在将新的Android Paging Library实现到我的项目中,我需要从网络服务器加载文章列表.
我有一个ArticlesRepository
类,它返回一个ArticleList
包含ArticleListItem
我想在RecyclerView中显示的实例的类.文章列表已经分页的服务器上,这样仓库发送对第一页的请求,并返回一个ArticleList
与page
属性设置为1
与articles
包含属性List
的请求页面上的文章.我不知道一页上有多少篇文章.
现在,我能够实现一个PageKeyedDataSource
,但它只获取第一页:
@Override public void loadInitial(@NonNull LoadInitialParamsparams, @NonNull LoadInitialCallback callback) { ArticleList list = load(1); if (list != null) { callback.onResult(list.articles, null, next(list)); } } @Override public void loadBefore(@NonNull LoadParams params, @NonNull LoadCallback callback) { ArticleList list = load(previous(params.key)); if (list != null) { callback.onResult(list.articles, previous(list)); } } @Override public void loadAfter(@NonNull LoadParams params, @NonNull LoadCallback callback) { ArticleList list = load(next(params.key)); if (list != null) { callback.onResult(list.articles, next(list)); } }
该previous
/ next
函数返回一个Integer
与一个/下一个页码或null
是否有isn't之一.
在我的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内部,根据此问题,库没有内置对此的支持。
当您将recyclerview放在无限滚动的父级中时,它将布局其所有子级,因为父级提供了无限的尺寸。
您需要创建自己的Nested Scroll View实现,此要旨中实际上有一个可以帮助您的实现。
还建议将fillViewPort添加到此自定义嵌套滚动视图:
android:fillViewport =“ true”到可滚动容器