我有一个活动,向用户显示项目列表,并使用分页库。我的问题是,当用户向下滑动屏幕时,我无法重新加载列表,以便再次从服务器获取数据。
这是我的DataSource Factory:
public class CouponListDataSourceFactory extends DataSource.Factory {
private CouponListDataSource dataSource;
public CouponListDataSourceFactory(CouponRepository repository, String token, String vendorId) {
dataSource = new CouponListDataSource(repository, token, vendorId);
}
@Override
public DataSource create() {
return dataSource;
}
}
以下是我如何创建PagedList
PagedList.Config config = new PagedList.Config.Builder()
.setInitialLoadSizeHint(15)
.setPageSize(10)
.build();
LiveData<PagedList<Coupon>> couponsLiveData = new LivePagedListBuilder<>(dataSourceFactory, config).build();
答案 0 :(得分:8)
调用 mDataSource.invalidate()方法后,mDataSource将失效,并且新的DataSource实例将通过DataSource.Factory.create()方法创建,因此对于提供新的每次在DataSource.Factory.create()方法中使用DataSource()实例,都不要每次都提供相同的DataSource实例。
mDataSource.invalidate()无法正常工作,因为失效后,CouponListDataSourceFactory提供了相同的,已经失效的DataSource实例。
修改后,CouponListDataSourceFactory看起来像下面的样子,并且调用 mCouponListDataSourceFactory.dataSource.invalidate()方法将刷新,或者替代,而不是保留dataSource实例在工厂内部,我们可以在 LiveData
public class CouponListDataSourceFactory extends DataSource.Factory {
private CouponListDataSource dataSource;
private CouponRepository repository;
private String token;
private String vendorId;
public CouponListDataSourceFactory(CouponRepository repository, String token, String vendorId) {
this.repository = repository;
this.token = token;
this.vendorId = vendorId;
}
@Override
public DataSource create() {
dataSource = new CouponListDataSource(repository, token, vendorId);
return dataSource;
}
}
答案 1 :(得分:3)
在ViewModel类中添加方法
public void refresh() {
itemDataSourceFactory.getItemLiveDataSource().getValue().invalidate();
}
,您可以在“活动/片段”中使用
swipeRefreshLayout.setOnRefreshListener(() -> yourviewModel.refresh());
在reyclerView加载时隐藏刷新布局
yourViewModel.itemPagedList.observe(this, allProposalModel -> {
mAdapter.submitList(model);
swipeRefreshLayout.setRefreshing(false); //here..
});