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

Android新手求助:Activity转Fragment及Fragment跳转Activity问题

问题排查和修改方法

你的代码主要存在几个问题,导致Fragment跳转Activity失效、列表数据显示异常,以下是具体修改点:

一、修复跳转失效:确保Context有效

Fragment中使用getActivity()可能返回null(比如Fragment未正确依附Activity时),换成requireActivity()可以强制保证Context不为空,避免跳转失败。

修改位置:Fragmentbell的点击事件和DbHandler初始化

原代码:

databaseHandler = new DbHandler(getActivity());
Intent intent = new Intent(getActivity(), ActivityNotificationDetail.class);
this.startActivity(intent);

改成:

databaseHandler = new DbHandler(requireActivity());
Intent intent = new Intent(requireActivity(), ActivityNotificationDetail.class);
startActivity(intent); // Fragment本身有startActivity方法,无需加this

二、修复列表数据不显示:确保Adapter拿到最新数据

你当前先加载数据再初始化Adapter,但后续数据更新时(比如点击后修改数据库状态),Adapter不会自动刷新。调整代码顺序,先初始化空Adapter,再加载数据并通知Adapter更新:

修改位置:Fragmentbell的onCreateView

原代码顺序:

loadDataFromDatabase();
// ...
adapterbell = new Adapterbell(getActivity(), recyclerView, data);
recyclerView.setAdapter(adapterbell);

改成:

// 先初始化空Adapter
adapterbell = new Adapterbell(requireActivity(), recyclerView, new ArrayList<>());
recyclerView.setAdapter(adapterbell);
// 再加载数据并刷新Adapter
loadDataFromDatabase();

修改loadDataFromDatabase方法:

private void loadDataFromDatabase() {
    databaseHandler = new DbHandler(requireActivity());
    data = databaseHandler.getAllbell();
    // 数据加载完成后通知Adapter更新
    if (adapterbell != null) {
        adapterbell.resetListData();
        adapterbell.insertData(data);
    }
}

三、修复返回键处理:替代不可靠的View焦点监听

你用getView().setOnKeyListener处理返回键,只有当View获取焦点时才生效,换成官方推荐的OnBackPressedCallback更可靠:

修改方式:删除Fragmentbell中的onResume方法,在onCreateView末尾添加:

// 处理返回键跳转MainActivity
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), new OnBackPressedCallback(true) {
    @Override
    public void handleOnBackPressed() {
        Intent intent1 = new Intent(requireActivity(), MainActivity.class);
        startActivity(intent1);
    }
});

四、优化点击后的状态更新:刷新列表显示

点击列表项修改数据库状态后,需要重新加载数据并刷新列表,否则显示的还是旧状态:

修改位置:Fragmentbell的点击事件

在databaseHandler.updateStatus(...)后添加:

// 重新加载数据并刷新列表
data = databaseHandler.getAllbell();
adapterbell.resetListData();
adapterbell.insertData(data);

五、可选优化:简化LayoutManager

你用1列的StaggeredGridLayoutManager和普通线性布局效果一致,可以换成更简洁的LinearLayoutManager:

recyclerView.setLayoutManager(new LinearLayoutManager(requireActivity()));

验证注意事项

  1. 确认ActivityNotificationDetail已经在AndroidManifest.xml中注册,否则会报错找不到Activity。
  2. 测试列表是否正常显示数据,点击后是否能跳转到详情页。
  3. 测试返回键是否能正确回到MainActivity。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:25:56