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

popBackStackImmediate()返回空白页及RecyclerView数据丢失问题排查

问题分析与解决方案

我来帮你搞定这两个问题,咱们逐个拆解:

1. 返回键按下后显示空白页的问题

问题根源

你在WorkoutsActivity的onBackPressed()方法里同时调用了super.onBackPressed()和getSupportFragmentManager().popBackStackImmediate()。默认情况下,super.onBackPressed()已经会自动处理Fragment返回栈的弹出逻辑,额外调用popBackStackImmediate()相当于多执行了一次弹出操作,把最初添加的WorkoutsListFragment也给弹出了,所以返回后容器就只剩空白了。

修复方案

直接移除自定义的onBackPressed()方法即可,系统默认实现就能正确处理返回栈:

// 删除这个自定义方法
// @Override
// public void onBackPressed() {
//     super.onBackPressed();
//     getSupportFragmentManager().popBackStackImmediate();
// }

如果确实需要自定义返回逻辑,也可以改成这样(确保只执行一次弹出):

@Override
public void onBackPressed() {
    // 先检查是否有返回栈可以弹出
    if (!getSupportFragmentManager().popBackStackImmediate()) {
        // 没有返回栈时,再执行Activity默认的退出逻辑
        super.onBackPressed();
    }
}

2. swapData方法清空原参数数据集的问题

问题根源

Java里List是引用类型,当你把参数dataSet直接赋值给this.dataSet,或者调用this.dataSet.addAll(dataSet)时,如果传入的dataSet和this.dataSet指向同一个内存地址的List实例,调用clear()就会同时清空原数据集——本质是两个变量共享了同一个List对象。

修复方案

在swapData方法中创建新的List实例来存储数据,切断引用关联:

public void swapData(List<Workout> dataSet){
    // 创建新的ArrayList拷贝传入的数据,避免引用原对象
    List<Workout> newDataSet = new ArrayList<>(dataSet);
    if (this.dataSet != null) {
        this.dataSet.clear();
        this.dataSet.addAll(newDataSet);
    } else {
        this.dataSet = newDataSet;
    }
    notifyDataSetChanged();
}

或者更简洁的写法:

public void swapData(List<Workout> dataSet){
    // 直接替换为新的List实例,彻底和原参数解耦
    this.dataSet = new ArrayList<>(dataSet);
    notifyDataSetChanged();
}

这样不管传入的dataSet是什么引用,this.dataSet都会指向一个全新的List,后续的操作再也不会影响原参数数据集了。

另外顺便提个小细节:你的ViewHolder点击事件里硬编码传了9作为workoutId,记得改成实际的this.workoutId哦:

card.setOnClickListener((View v) -> {
    Log.i("view", ""+ this.workoutId);
    onWorkoutSelectedInterface.onWorkoutSelected(this.workoutId); // 替换硬编码的9
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:59:21