Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用新的分页库实现SwipeRefreshLayout_Android_Android Architecture Components - Fatal编程技术网

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

Android 如何使用新的分页库实现SwipeRefreshLayout,android,android-architecture-components,Android,Android Architecture Components,我得到了一个向用户显示项目列表的活动,它使用分页库。我的问题是,当用户向下滑动屏幕以便再次从服务器获取数据时,我无法重新加载列表 这是我的数据源工厂: public class CouponListDataSourceFactory extends DataSource.Factory { private CouponListDataSource dataSource; public CouponListDataSourceFactory(CouponRepository re

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

这是我的数据源工厂:

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.Config config = new PagedList.Config.Builder()
                .setInitialLoadSizeHint(15)
                .setPageSize(10)
                .build();
LiveData<PagedList<Coupon>> couponsLiveData = new LivePagedListBuilder<>(dataSourceFactory, config).build();
PagedList.Config Config=new PagedList.Config.Builder()
.setInitialLoadSizeHint(15)
.setPageSize(10)
.build();
LiveData couponsLiveData=新的LivePagedListBuilder(dataSourceFactory,config).build();

调用mDataSource.invalidate()方法后,mDataSource将失效,新的数据源实例将通过DataSource.Factory.create()方法创建,因此每次在DataSource.Factory.create()方法中提供新的DataSource()实例非常重要,不要每次都提供相同的数据源实例

mDataSource.invalidate()不起作用,因为失效后,CouponListDataSourceFactory提供相同的、已经失效的数据源实例

修改后,CouponListDataSourceFactory将如下面的smple中所示,并调用mCouponListDataSourceFactory.dataSource.invalidate()方法将进行刷新,或者而不是将dataSource实例保留在工厂内,我们可以在LiveData>上调用invalidate方法。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;
}
}

在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..


    });

只需使自定义的
数据源
无效,您有什么
数据源
?@pskink我使用位置数据源。我在数据源上调用invalidate方法,但它什么也不做。失效后我还需要做些什么吗?您可以使用
PagedListAdapter
?你的密码是什么?
PagedList#isDetached()
返回什么?是的,我使用LivePagedListBuilder创建它,并将它从我的viewmodel返回到我的activity。您传递给
LivePagedListBuilder
构造函数的
DataSource.Factory
的代码是什么?你会发布任何源代码吗?我试图使liveDataSource无效,但当无效时,适配器将清空,并在加载完成后再次显示。你能告诉我什么时候开始刷新吗,适配器不是空的,刷新完成后适配器将被替换对不起,你能澄清你的问题吗,我不明白主要的意思。不过,对于分页库和滑动刷新,我想了解如何在分页库上应用刷新操作,我尝试过,但看起来很难看,当操作开始滑动刷新适配器时,我的适配器已空,很抱歉回答太晚。我刚刚推了新版本的,它通过显示刷到刷新指示器来获取初始数据,首先是原因。后台线程上已经调用了ModelDataSource.loadInitial()方法,在调用loadInitial方法之后,数据将被提取。因此,在网络类中将caroutine的启动方法替换为runblocking将解决这个问题。另一种方法是同步调用翻新api方法,而不在loadInitial方法中重复使用caroutin,在调用invalidate之后,列表不再加载。我应该做另一个动作还是它自己工作?在我的例子中,看到日志,它会刷新所有数据,但不会显示。我还应该做什么?