Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 分页库的意外行为_Java_Android_Android Paging - Fatal编程技术网

Java 分页库的意外行为

Java 分页库的意外行为,java,android,android-paging,Java,Android,Android Paging,我开始了解分页库,我遇到了一个问题 我能够获取数据并显示在我的recyclerView中,但我真的有奇怪的beahviors 我将日志放在loadInitial、loadBefore和loadAfter上,第一次loadInitial和loadAfter立即依次调用 当我向下滚动时,我从响应中记录getPage,它在20个项目后给了我正确的页码,但我真的怀疑它只是第一次加载所有页面,我的意思是,我可以直接滚动500个项目,而不用等待加载一次 正如我所说的第一个问题——它在第一时间一个接一个地称为

我开始了解分页库,我遇到了一个问题

我能够获取数据并显示在我的recyclerView中,但我真的有奇怪的beahviors

我将日志放在
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) {

                    }
                }
        );
    }
}
公共类MoviesDataSource扩展了PageKeyedDataSource{
专用静态最终int第一页=1;
@凌驾
public void loadInitial(@NonNull LoadInitialParams params,@NonNull LoadInitialCallback callback){
Log.i(标签“loadInitial:”);
ApiService.getAllMovies().getAllMovies(API_键,第一页)。排队(
新回调函数(){
@凌驾
公共void onResponse(调用、响应){
if(response.body()!=null){
Log.i(标记“onResponse:+response.body().getPage());
List results=Arrays.asList(response.body().getResults());
onResult(results,null,第一页+1);
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
}
}
);
}
@凌驾
public void loadBefore(@NonNull LoadParams params,@NonNull LoadCallback callback){
Log.i(标签“loadBefore:”);
ApiService.getAllMovies().getAllMovies(API_键,params.KEY)。排队(
新回调函数(){
@凌驾
公共void onResponse(调用、响应){
Log.i(标记“onResponse:+response.body().getPage());
整数key=(params.key>1)?params.key-1:null;
if(response.body()!=null){
List results=Arrays.asList(response.body().getResults());
onResult(results,key);
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
}
}
);
}
@凌驾
public void loadAfter(@NonNull LoadParams params,@NonNull LoadCallback callback){
Log.i(标签“loadAfter:”);
ApiService.getAllMovies().getAllMovies(API_键,params.KEY)。排队(
新回调函数(){
@凌驾
公共void onResponse(调用、响应){
Log.i(标记“onResponse:+response.body().getPage());
整数key=params.key+1;//计算直到没有数据为止
if(response.body()!=null){
List results=Arrays.asList(response.body().getResults());
onResult(results,key);
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
}
}
);
}
}
main活动

    @Override
        public void onChanged(PagedList<Results> results) {
            adapter.submitList(results);
        }
@覆盖
更改后的公共作废(页面列表结果){
适配器。提交列表(结果);
}

ViewModel

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

第二:在一个方向上加载数据,这样就不会调用
loadBefore

此外,您应该使用同步改装调用,您可以在此处找到参考: 我正在基于相同的api开发应用程序,同时学习jetpack的东西,我比你们稍早一点(缓存db+网络):)