PageList.size始终为零

11

实际上,我对分页库还很新。这是情况,我正在观察来自PagedList的数据,该数据是从我的ViewModel中获取的,即使最新消息已出现在UI上,它仍然返回零。

 viewModel.getNews().observe(this, news -> {
                    swipeRefreshLayout.setRefreshing(false);
                    Timber.d("news size is %s",news.size());// **news size is 0**
                    adapter.submitList(news);
                });

我的数据源是

public class NewsDataSource extends ItemKeyedDataSource<String, News> {

    private MutableLiveData<Resource.Status> netStatusLive = new MutableLiveData<>();

   /*Hide Logic for clean purpose*/

    private List<News> localNewsList = new ArrayList<>();

    public NewsDataSource( /*Hide Logic for clean purpose*/) {
         /*Hide Logic for clean purpose*/
    }


    @Override
    public void loadInitial(@NonNull LoadInitialParams<String> params, @NonNull LoadInitialCallback<News> callback) {
        netStatusLive.postValue(Resource.Status.LOADING);
        localNewsList.clear();
        Disposable disposable =  /*Hide Logic for clean purpose*/

        compositeDisposable.add(disposable);
    }

    @Override
    public void loadAfter(@NonNull LoadParams<String> params, @NonNull LoadCallback<News> callback) {
        if (localNewsList.size() > 19) {
            netStatusLive.postValue(Resource.Status.LOADING);
            Disposable disposable =  /*Hide Logic for clean purpose*/
            compositeDisposable.add(disposable);
        }

    }

    private String getLastIdOfNews(List<News> localNewsList) {
        if (localNewsList.size() <= 0) {
            return "android";
        } else {
            return localNewsList.get(localNewsList.size() - 1).getId();
        }
    }

    @Override
    public void loadBefore(@NonNull LoadParams<String> params, @NonNull LoadCallback<News> callback) {
        //do nothing...
    }

    @NonNull
    @Override
    public String getKey(@NonNull News item) {
        return item.getId();
    }

    private void onPaginationError(Throwable throwable) {
        netStatusLive.postValue(Resource.Status.ERROR);
        Timber.e(throwable);
    }

    public LiveData<Resource.Status> getNetworkState() {
        return netStatusLive;
    }

}
在这种情况下,需要localNewsListloadAfter时提供新闻的最后一个id,就像这样。
Observable<List<News>> getNewsList(@Query("skip") int skip,
                                            @Query("limit") int limit,
                                            @Query("lastNewsId") String lastNewsId);

我的DataSourceFactory是

    public class NewsDataSourceFactory extends DataSource.Factory<String, Journal> {
        private MutableLiveData<JournalDataSource> dataSourceLive = new MutableLiveData<>();

         /*Hide Logic for clean purpose*/

        public NewsDataSourceFactory( /*Hide Logic for clean purpose*/) {
             /*Hide Logic for clean purpose*/
        }

        @Override
        public DataSource<String, Journal> create() {
            JournalDataSource dataSource = new JournalDataSource( /*Hide Logic for clean purpose*/);
            dataSourceLive.postValue(dataSource);
            return dataSource;

        }
 public void prepareData(String coursId, String studnetId) {
        this.coursId = coursId;
        this.studnetId = studnetId;
    }


        public MutableLiveData<JournalDataSource> getDataSource() {
            return dataSourceLive;
        }
    }

ViewModle 是

public class NewsViewModel extends ViewModel {

    private LiveData<PagedList<News>> newslist = new MutableLiveData<>();
    private LiveData<Resource.Status> networkState = new MutableLiveData<>();

    private NewsDataSourceFactory factory;

    private PagedList.Config config;

    private Executor executor;


    NewsViewModel(NewsDataSourceFactory factory, PagedList.Config config) {
        this.factory = factory;
        this.config = config;

        executor = Executors.newFixedThreadPool(5);


        networkState = Transformations.switchMap(factory.getDataSource(), source -> {
                    Timber.d("network status get");
                    return source.getNetworkState();
                }
        );
    }

    public void getNews(String courseId, String studentId) {
        //Newss = repo.getNewss(auth, courseId, studentId, 0, 20, "android");
        factory.prepareData(courseId, studentId);
        newslist = new LivePagedListBuilder<>(factory, config).setFetchExecutor(executor).build();
    }

    public void refresh() {
        factory.getDataSource().getValue().invalidate();
    }

    public LiveData<PagedList<News>> getNews() {
        return newslist;
    }

    public LiveData<Resource.Status> getNetworkState() {
        return networkState;
    }

我认为,我的问题可能是我的数据源用例与数据源类型不匹配。因此,Pagelist不能像我们预期的那样正常工作。


不太确定,但你能否请将%s更改为%d,并检查一下。 - Solaiman Hossain
谢谢你的回答。我尝试过了,但我认为它并没有解决我的问题。 - amlwin
你能发布你的工厂类吗? - Ümañg ßürmån
@Ümañgßürmån 我更新了。 - amlwin
你能添加你的 ViewModel 吗? - Zwal Pyae Kyaw
@ZwalPyaeKyaw 已更新! - amlwin
1个回答

3
根据Android分页库文档,您应该同步调用API!如果您使用RxRetrofit,只需删除observeOn()和subscribeOn()以在当前线程上运行API,即可与分页库一起使用。我进行了测试,对我来说效果很好。

1
谢谢!它起作用了。然而,它只对观察者响应一次(目前是viewModel.getNews().observe(this, news -> { Timber.d("news size is %s",news.size());// **news size is 20** //..... });)。我需要的是,当我滚动列表时,它应该显示40、60等等。 - amlwin
哇,谢谢你。这导致我的回收器在我触摸屏幕之前无法显示结果。我删除了 observeOn()subscribeOn(),并使用 ExecutorLivePagedListBuilder,它就像魔术般地运行起来了。PageList 是一个需要小心操作的类。 - Astonio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接