You need to enable JavaScript to run this app. Android Paging3 RxJava环境下调用adapter.refresh()页面不刷新
优惠活动
大模型
产品
解决方案
定价
更多

Android Paging3 RxJava环境下调用adapter.refresh()页面不刷新

问题根因

  1. RxPagingSource未重写getRefreshKey()方法:该方法是Paging3执行刷新时获取初始加载页码的核心接口,缺失后Paging无法触发刷新请求。
  2. ViewModel数据流处理错误:仅单次订阅Paging数据流并将首次生成的PagingData存为静态变量,后续刷新产生的新PagingData无法传递到Adapter。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 04:24:01