Android Paging3 RxJava环境下调用adapter.refresh()页面不刷新
问题根因
RxPagingSource未重写getRefreshKey()方法:该方法是Paging3执行刷新时获取初始加载页码的核心接口,缺失后Paging无法触发刷新请求。- ViewModel数据流处理错误:仅单次订阅Paging数据流并将首次生成的
PagingData存为静态变量,后续刷新产生的新PagingData无法传递到Adapter。 PagingRx.cachedIn()返回值未接收:该方法会返回经过缓存处理的新数据流,原调用未承接返回值导致缓存和刷新支持失效。
修复步骤
1. 补全DataSource实现
在你的FakeTestSource类中添加getRefreshKey()重写:
@Nullable @Override public Integer getRefreshKey(@NotNull PagingState<Integer, L> pagingState) { // 刷新默认回到第一页,可根据业务调整返回对应起始页码 return 1; }
如果需要刷新后停留在当前浏览位置,可通过pagingState获取最近锚点位置对应的页码返回即可。
2. 修正ViewModel数据流
将Paging数据流作为可观察对象暴露,不要单次订阅保存静态PagingData:
// ViewModel公开可观察的Paging数据流 public final Flowable<PagingData<PojoPassengerData>> pagingDataFlow; public YourViewModel(ApiService mApiService) { Pager<Integer, PojoPassengerData> pager = new Pager<>( new PagingConfig(TOTAL_PAGES), () -> new FakeTestSource(mApiService) ); // 承接cachedIn返回的处理后数据流,支持缓存和刷新 pagingDataFlow = PagingRx.getFlowable(pager) .compose(PagingRx.cachedIn(viewModelScope)); }
3. 调整Fragment订阅逻辑
在Fragment生命周期内订阅数据流,新数据发射时自动提交给Adapter:
// 在onViewCreated中执行订阅 mCompositeDisposable.add( mViewModel.pagingDataFlow .observeOn(AndroidSchedulers.mainThread()) .subscribe(pagingData -> adapter.submitData(getViewLifecycleOwner().getLifecycle(), pagingData) ) );
记得在Fragment的onDestroyView中调用mCompositeDisposable.dispose()避免内存泄漏。
4. 刷新逻辑保留原有实现
原有onRefresh方法中的adapter.refresh()可以正常生效,无需额外修改。
内容的提问来源于stack exchange,提问作者Vijay Chaudhary
相关产品推荐
相关产品推荐

