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

我可以获取数据并在我的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) {

                    }
                }
        );
    }
}


主要活动

    @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/

10-12 05:32