Android 点击RecyclerView传参到同Fragment实现层级返回
团队列表层级下钻功能修复方案
当前代码存在的核心问题
- Fragment跳转时未将事务加入回退栈,返回操作无法恢复上一级视图
- 返回按钮使用的Fragment管理器与跳转时的管理器不一致,回退操作失效
- 读取传参时未做非空判断,首次进入时易触发空指针崩溃
onDetach方法中重复调用网络请求,导致列表数据叠加、重复加载- 加载新数据集前未清空旧列表缓存,新旧数据混排
具体修改步骤
安全读取页面传参
替换原有的直接读参逻辑,兼容首次进入无参数的场景:// 原易崩溃代码:nuserid = getArguments().getString("nuserid"); // 修改为 if (getArguments() != null) { nuserid = getArguments().getString("nuserid", "111"); }重构Fragment跳转逻辑,加入回退栈
点击列表项启动新Fragment时,将事务加入回退栈,保证返回时能恢复上一级实例:directLeftTeamAdapter.setOnItemClickListner(new DirectLeftTeamAdapter.onItemClickListner() { @Override public void onClick(String newuserid) { DirectTeamLeftFragment nextFragment = new DirectTeamLeftFragment(); Bundle bundle = new Bundle(); bundle.putString("nuserid", newuserid); nextFragment.setArguments(bundle); getActivity().getSupportFragmentManager() .beginTransaction() .replace(R.id.content_frame, nextFragment) // 核心:将事务加入回退栈 .addToBackStack(DirectTeamLeftFragment.class.getSimpleName()) .commit(); } });修复返回按钮逻辑
统一使用与跳转一致的SupportFragmentManager执行回退操作,移除之前错误的getFragmentManager调用:backbtn.setOnClickListener(v -> getActivity().getSupportFragmentManager().popBackStack() );移除错误的重复加载逻辑
直接删除onDetach中重写的网络请求代码:该方法是Fragment从宿主页面移除时的生命周期回调,在此处发起网络请求不仅会造成重复加载,还会因上下文销毁触发崩溃
即删除以下代码块:// @Override // public void onDetach() { // super.onDetach(); // getLeftDirectTeamList(Userid, Token,nuserid); // }优化列表数据加载流程
拉取新数据前先清空已有列表,避免新旧数据叠加显示:
修改getLeftDirectTeamList中的响应处理逻辑:@Override public void onResponse(@NotNull Call<ArrayList<TeamModal>> call, @NotNull Response<ArrayList<TeamModal>> response) { progressDialog.dismiss(); if(response.body()!=null){ ArrayList<TeamModal> teamModals = response.body(); // 核心:清空旧数据后再添加新数据集 LeftTeamList.clear(); for(TeamModal tmlist: teamModals){ TeamModal teamModal = new TeamModal(tmlist.getName(), tmlist.getUserid(),tmlist.getPhone(),tmlist.getSponsor(),tmlist.getDoj(),tmlist.getRank(), tmlist.getMembertype(),tmlist.getEarnings(),tmlist.getTeamcount()); LeftTeamList.add(teamModal); } directLeftTeamAdapter.notifyDataSetChanged(); } }
实现效果
- 逐层点击用户卡片时,每个对应层级的Fragment实例会被依次压入回退栈,各自持有独立的Userid参数、已加载的列表数据
- 点击返回按钮时,会从回退栈弹出当前层级的Fragment,自动恢复上一级的视图与已加载数据,无需重新发起接口请求
- 回到第一层级时回退栈自然弹空,不会出现页面叠加重复问题
内容的提问来源于stack exchange,提问作者Asesha
相关产品推荐
相关产品推荐

