gpt4 book ai didi

java - 分页库的意外行为

转载 作者:行者123 更新时间:2023-12-01 16:34:18 25 4
gpt4 key购买 nike

我开始学习分页库,但我遇到了一个问题。

我能够获取数据并在我的 recyclerView 中显示,但我的行为真的很奇怪。

我将日志放在loadInitialloadBeforeloadAfter以及第一次loadInitialloadAfter上 立即一个接一个地调用。

当我向下滚动时,我从响应中记录 getPage ,它在 20 个项目之后给了我正确的页码,但我真的怀疑它只是加载了所有页面我的意思是,我第一次可以滚动 500 个项目,甚至无需等待加载一次。

正如我所说的第一个问题 - 它在第一次时立即一个接一个地调用 loadInitialloadAfter

第二个问题 - 当我向上滚动时,loadBefore从不触发。

我不确定应该共享哪些代码,但我怀疑问题出在数据源内部的某个地方,如果您需要更多信息,请在评论中告诉我

代码:

public class MoviesDataSource extends PageKeyedDataSource<Integer, Results> {

private static final int FIRST_PAGE = 1;


@Override
public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull LoadInitialCallback<Integer, Results> callback) {
Log.i(TAG, "loadInitial: ");

ApiService.getAllMovies().getAllMovies(API_KEY, FIRST_PAGE).enqueue(
new Callback<AllMovies>() {
@Override
public void onResponse(Call<AllMovies> call, Response<AllMovies> response) {
if (response.body() != null) {
Log.i(TAG, "onResponse: " + response.body().getPage());
List<Results> results = Arrays.asList(response.body().getResults());
callback.onResult(results, null, FIRST_PAGE + 1 );
}

}

@Override
public void onFailure(Call<AllMovies> call, Throwable t) {

}
}
);
}

@Override
public void loadBefore(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, Results> callback) {
Log.i(TAG, "loadBefore: ");
ApiService.getAllMovies().getAllMovies(API_KEY, params.key).enqueue(
new Callback<AllMovies>() {
@Override
public void onResponse(Call<AllMovies> call, Response<AllMovies> response) {
Log.i(TAG, "onResponse: " + response.body().getPage());
Integer key = (params.key > 1) ? params.key -1 : null;

if (response.body() != null) {
List<Results> results = Arrays.asList(response.body().getResults());
callback.onResult(results, key );
}
}

@Override
public void onFailure(Call<AllMovies> call, Throwable t) {

}
}
);
}

@Override
public void loadAfter(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, Results> callback) {
Log.i(TAG, "loadAfter: ");
ApiService.getAllMovies().getAllMovies(API_KEY, params.key).enqueue(
new Callback<AllMovies>() {
@Override
public void onResponse(Call<AllMovies> call, Response<AllMovies> response) {
Log.i(TAG, "onResponse: " + response.body().getPage());

Integer key = params.key + 1; // calculate until there is no data

if (response.body() != null) {
List<Results> results = Arrays.asList(response.body().getResults());
callback.onResult(results, key );
}
}

@Override
public void onFailure(Call<AllMovies> call, Throwable t) {

}
}
);
}
}

主要 Activity

    @Override
public void onChanged(PagedList<Results> results) {
adapter.submitList(results);
}

View 模型

最佳答案

第一个问题:基于 PagedList.Config 预取距离和页面大小配置调用 loadAfter。要控制 PagedList 从其 DataSource 查询数据的方式和时间,请参阅 PagedList .配置

第二:您以一个方向加载数据,因此 loadBefore 永远不会被调用。

此外,您应该使用同步改造调用,您可以在此处找到引用:network only paging我正在开发基于相同 api 的应用程序,同时学习 jetpack 的东西,我比你领先一点(缓存数据库 + 网络):)

关于java - 分页库的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61992394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com