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

Jac*_*cob 12 java android android-recyclerview android-viewmodel android-paging

我是开发Android应用程序的新手,我正在尝试以"正确的方式"做所有事情.所以现在,我正在将新的Android Paging Library实现到我的项目中,我需要从网络服务器加载文章列表.

我有一个ArticlesRepository类,它返回一个ArticleList包含ArticleListItem我想在RecyclerView中显示的实例的类.文章列表已经分页的服务器上,这样仓库发送对第一页的请求,并返回一个ArticleListpage属性设置为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));
    }
}
Run Code Online (Sandbox Code Playgroud)

previous/ next函数返回一个Integer与一个/下一个页码或null是否有isn't之一.

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

PagedList.Config config = new PagedList.Config.Builder()
            .setEnablePlaceholders(false)
            .setInitialLoadSizeHint(1)
            .setPageSize(1)
            .setPrefetchDistance(1)
            .build();
Run Code Online (Sandbox Code Playgroud)

这种方式我可以加载第一页,但是当我滚动到RecyclerView的底部(在NestedScrollView中)时,没有任何反应.调试显示PageKeyedDataSource.loadAfter未调用该方法.

我是否必须以某种方式告诉PagedList必须加载下一页,或者它是RecyclerView/DataSource/GodKnowsWhatElse的工作,我只是做错了什么?谢谢你的建议.

Lev*_*ira 15

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

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

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

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

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

  • 每天我都在问为什么我是一名 android 开发人员,然后 stackoverflow 改变了我的想法,谢谢,这有效! (4认同)
  • 谢谢,确实是这个原因。我没有实现自己的嵌套滚动视图,而是将其完全删除,并将滚动视图中的其他视图放在回收器视图中,从而解决了这个问题并提高了性能。 (2认同)