You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从其他应用跳转返回时如何通知RecyclerView Adapter更新数据?

问题原因分析
  • 最常见的原因是 onSkuDetails 回调运行在子线程:从Google Play商店返回到应用时,支付SDK的回调默认可能在工作线程执行,此时直接调用 notifyDataSetChanged() 不属于主线程UI操作,系统不会触发RecyclerView的重绘逻辑,而手动下拉刷新本身是主线程触发的操作,所以更新正常。
  • 第二个可能的原因是代码笔误:你贴的初始化代码里有一行 listCardAdapter.setAdapter(subscriptionListCardAdapter); 是逻辑错误,正确应该是给RecyclerView设置Adapter,也就是 listView.setAdapter(listCardAdapter);,如果Adapter没有正确绑定到RecyclerView,也会出现数据更新后视图不刷新的问题。
  • 第三种场景是Activity退后台时RecyclerView被标记为detached状态,从其他应用返回时 onSkuDetails 触发时机早于RecyclerView重新attach到窗口的时机,此时notify不会生效。
解决方案

1. 强制所有Adapter更新操作在主线程执行

修改 onSkuDetails 方法,把数据更新逻辑抛到主线程运行:

@Override
public void onSkuDetails(List<SkuDetails> skuDetails) {
    removeProgressDialog();
    // 切主线程更新UI
    runOnUiThread(() -> listCardAdapter.setData(subscription, skuDetails));
}

2. 修正Adapter绑定逻辑

把初始化代码里错误的Adapter绑定行替换为正确逻辑:

// 删掉错误的 listCardAdapter.setAdapter(subscriptionListCardAdapter);
listView.setAdapter(listCardAdapter);

3. 增加返回前台的兜底刷新逻辑

新增一个标记位记录是否从Play商店跳转回来,在onResume生命周期里兜底触发刷新:

// 新增成员变量
private boolean isBackFromPlayStore = false;

// 跳转Play商店前设置标记
public void jumpToPlayStoreSubPage() {
    isBackFromPlayStore = true;
    // 原有跳转逻辑...
}

@Override
protected void onResume() {
    super.onResume();
    if (isBackFromPlayStore) {
        isBackFromPlayStore = false;
        // 重新拉取订阅数据+强制刷新视图
        getPurchases();
        listView.invalidate();
    }
}

4. 优化更新逻辑(可选)

用DiffUtil替代直接调用notifyDataSetChanged,可以更精准判断数据变化、触发对应位置的item刷新,避免全局刷新的性能问题,也能解决部分因为数据对比异常导致的不刷新问题。

内容的提问来源于stack exchange,提问作者NicoTing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 14:12:00