我开始学习分页库,但是我遇到了问题。
我可以获取数据并在我的recyclerView中显示,但是我确实很奇怪。
我将日志放在loadInitial
,loadBefore
和loadAfter
上,并且第一次loadInitial
和loadAfter
立即相互调用。
当我向下滚动时,我从响应中登录getPage
,它在20个项目后为我提供了正确的页码,但我真的怀疑它只是第一次加载所有页面,我的意思是,我可以逐字滚动500个项目而无需等待加载一次。
正如我所说,第一个问题是它在第一时间立即依次调用loadInitial
和loadAfter
。
第二个问题-当我向上滚动时,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) {
}
}
);
}
}
主要活动
@Override
public void onChanged(PagedList<Results> results) {
adapter.submitList(results);
}
视图模型
最佳答案
第一个问题:loadAfter
是根据PagedList.Config
预取距离和页面大小配置调用的。要控制PagedList从其DataSource查询数据的方式和时间,请参阅PagedList.Config
第二:沿一个方向加载数据,因此永远不会调用loadBefore
。
另外,您应该使用同步改造调用,您可以在此处找到参考:network only paging
我在学习Jetpack内容的同时基于相同的api开发应用程序,这还不算什么(缓存数据库+网络):)
关于java - 分页库的意外行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61992394/