Сетевой пейджинг с pagedList в библиотеке arch - PullRequest
0 голосов
/ 02 июля 2018

Android добавляет библиотеку подкачки как часть компонента архитектуры для использования нумерации ресурса. Я использую этот пример для этого. Я пишу эти коды, но в моем 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);

Где моя ошибка? почему PostDataSourceFactory возвращает ноль create()?

1 Ответ

0 голосов
/ 25 июля 2018

Использование объекта MutableLiveData для переноса источника данных

MutableLiveData используется для уведомления вашего пользовательского интерфейса при наблюдении любых данных

При использовании 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;
     }
    }
...