从其他应用跳转返回时如何通知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
相关产品推荐
相关产品推荐

