安卓使用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
相关产品推荐
相关产品推荐

