如何使用新的分页库实现SwipeRefreshLayout

时间:2018-04-28 09:18:04

标签: android android-architecture-components

我有一个活动,向用户显示项目列表,并使用分页库。我的问题是,当用户向下滑动屏幕时,我无法重新加载列表,以便再次从服务器获取数据。

这是我的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();

2 个答案:

答案 0 :(得分:8)

调用 mDataSource.invalidate()方法后,mDataSource将失效,并且新的DataSource实例将通过DataSource.Factory.create()方法创建,因此对于提供新的每次在DataSource.Factory.create()方法中使用DataSource()实例,都不要每次都提供相同的DataSource实例

mDataSource.invalidate()无法正常工作,因为失效后,CouponListDataSourceFactory提供了相同的,已经失效的DataSource实例。

修改后,CouponListDataSourceFactory看起来像下面的样子,并且调用 mCouponListDataSourceFactory.dataSource.invalidate()方法将刷新,或者替代,而不是保留dataSource实例在工厂内部,我们可以在 LiveData > .getValue()。getDataSource()。invalidate()

上调用无效方法
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..


    });