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

安卓使用Navigation导航返回Fragment后如何保留ListView滚动位置

问题原因

系统返回键返回时滚动位置丢失的核心原因是:你在第二个Fragment的返回键处理中使用navigate()方法跳转回首页Fragment,该操作会创建全新的首页Fragment实例压入回退栈,原有首页Fragment的视图状态(包含滚动位置)会被销毁。而Toolbar返回键默认调用popBackStack()弹出当前Fragment,回到之前已经存在的首页Fragment实例,因此能正常保留滚动位置。

解决步骤

1. 修改第二个Fragment的返回键逻辑

将navigate()调用替换为popBackStack(),直接弹出当前查看笔记的Fragment,回到之前的首页实例即可:

@Override
public void onAttach(@NonNull Context context) {
    super.onAttach(context);
    OnBackPressedCallback callback = new OnBackPressedCallback(true) {
        @Override
        public void handleOnBackPressed() {
            // 替换原有navigate逻辑,弹出回退栈
            Navigation.findNavController(getView()).popBackStack();
        }
    };
    requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
}

2. 优化首页Fragment的初始化逻辑(可选,用于更稳妥的状态保留)

如果你的文件读取、Adapter初始化逻辑写在onCreateView中,每次视图重建都会重新执行,也可能导致滚动位置丢失,可做如下调整:

  • 将文件列表读取、排序、Adapter初始化逻辑移到onCreate方法中,仅在Fragment首次创建时执行一次
  • 如需完全保证滚动位置不丢失,可增加滚动位置保存恢复逻辑:
// 首页Fragment添加成员变量
private int savedScrollPosition = 0;

@Override
public void onPause() {
    super.onPause();
    // 离开页面时保存当前可见的第一个条目位置
    savedScrollPosition = listView.getFirstVisiblePosition();
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    // 初始化ListView后恢复滚动位置
    listView.setSelection(savedScrollPosition);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:30:02