在Arch库中使用pagedList进行网络分页

时间:2018-07-02 13:00:20

标签: java android paging

Android将分页库添加为架构组件的一部分,以使用资源分页。我以this为例。我编写了这些代码,但是在我的DataSource.Factory中,我无法从网络退回收到的DataSource。让我们看看我的代码:

PostDataSource:

public class PostDataSource extends PageKeyedDataSource {

private final APIUtils api = RetrofitHelper.getInstance().create(APIUtils.class);
private final String TOKEN = TokenUtil.getCachedAuthToken();
private int page = 1;
private GeneralWebResult<ArrayList<Post>> postList;

@Override
public void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback callback) {

    api.getMainPosts("all",10,"new",page,TOKEN).enqueue(new Callback<GeneralWebResult<ArrayList<Post>>>() {
        @Override
        public void onResponse(Call<GeneralWebResult<ArrayList<Post>>> call, Response<GeneralWebResult<ArrayList<Post>>> response) {
            postList = response.body();
            callback.onResult(/*return ArrayList<Post> */postList.getResult(),null, ++ page);
            Log.e("RESULT",response.code()+" ");
        }

        @Override
        public void onFailure(Call<GeneralWebResult<ArrayList<Post>>> call, Throwable t) {
            Log.e("ERROR",t.getLocalizedMessage());
        }
    });
}

@Override
public void loadBefore(@NonNull LoadParams params, @NonNull LoadCallback callback) {

}

@Override
public void loadAfter(@NonNull LoadParams params, @NonNull LoadCallback callback) {
    ArrayList<Post> postList = new ArrayList<>();
    api.getMainPosts("all",10,"new",page,TOKEN).enqueue(new Callback<GeneralWebResult<ArrayList<Post>>>() {
        @Override
        public void onResponse(Call<GeneralWebResult<ArrayList<Post>>> call, Response<GeneralWebResult<ArrayList<Post>>> response) {
            postList.addAll(response.body().getResult());
            callback.onResult(postList,null);
            Log.e("RESULT",response.code()+" ");
        }

        @Override
        public void onFailure(Call<GeneralWebResult<ArrayList<Post>>> call, Throwable t) {
            Log.e("ERROR",t.getLocalizedMessage());
        }
    });
}
}  

PostDataSourceFactory:

public class PostDataSourceFactory extends DataSource.Factory {

private PostDataSource dataSource;

@Override
public DataSource create() {

    return new PostDataSource();
}
}

PostViewModel:

public class PostViewModel extends ViewModel {
public LiveData<PagedList<Post>> liveDataSource;


public PostViewModel() {
    Executor executor = Executors.newFixedThreadPool(5);
    PostDataSourceFactory factory = new PostDataSourceFactory(executor);


    PagedList.Config config = new PagedList.Config.Builder().setEnablePlaceholders(false)
            .setInitialLoadSizeHint(10).setPageSize(10).setPrefetchDistance(4).build();

    liveDataSource = (new LivePagedListBuilder(factory,config)).setFetchExecutor(executor).build();

    //Log.e("LIVE DATA SOURCE", liveDataSource.getValue().get(0).getContent());


}
}

PostAdapter:

public class PostAdapter extends PagedListAdapter<Post, PostAdapter.Holder> {

private PagedList<Post> items;

public void setItems(PagedList<Post> items) {
    this.items = items;
}

public class Holder extends RecyclerView.ViewHolder{

    TextView content;
    Holder(View itemView) {
        super(itemView);

        content = itemView.findViewById(R.id.item_post_test_content);
    }

    void bindTo(Post post){
        content.setText(post.getContent());
    }
}
PostAdapter() {
    super(Post.DiffCAllback);
}

@NonNull
@Override
public PostAdapter.Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    return new Holder(LayoutInflater.from(parent.getContext()).inflate(R.layout.post_test_item,parent,false));
}

@Override
public void onBindViewHolder(@NonNull PostAdapter.Holder holder, int position) {
    holder.bindTo(getItem(position));

}
}

MainActivity:

list = findViewById(R.id.home_list);
    list.setLayoutManager(new LinearLayoutManager(this));
    PostViewModel viewModel = ViewModelProviders.of(this).get(PostViewModel.class);


    PostAdapter adapter = new PostAdapter();
    viewModel.liveDataSource.observe(this,items ->{
                Log.e("ITEMS SIZE",items.size()+" ");
                adapter.setItems(items);
    } );

    list.setAdapter(adapter);

我的错误在哪里?为什么PostDataSourceFactorycreate()上返回null?

1 个答案:

答案 0 :(得分:0)

使用MutableLiveData对象包装数据源

MutableLiveData用于在观察任何数据时通知UI

使用LivePagedListBuilder时,建议使用MutableLiveData作为数据源的包装器

请参见PagingWithNetworkSample

您还需要更新数据源PagedKeyDataSource

 public class PostDataSourceFactory extends DataSource.Factory<Integer, Post> {
      public MutableLiveData<PostDataSource> datasourceLiveData = new MutableLiveData<>();


     public PostDataSourceFactory(
     }

     @Override
     public DataSource<Integer, Post> create() {
       PostDataSource dataSource = new PostDataSource();
       datasourceLiveData.postValue(dataSource);
       return dataSource;
     }
    }