我的情况:我有一个由一个Activity管理的两个ListFragments(称为A和B),它们保持对这两个片段的持久引用。当我单击片段A中的按钮时,我将其替换为片段B.当我执行以下操作时,问题就开始了。
A - > B - > (滚动) - > (后退按钮) - >乙
在这种情况下,当我第二次回到Fragment B时,会保留前一个滚动位置,这是我不想要的。相反,我希望Fragment B从其内容的顶部开始使用ListView。
我尝试过的无所事事:
setSelection(0)
onActivityCreated
setSelectionAfterHeaderViews()
onActivityCreated
smoothScrollToPosition(0)
onActivityCreated
有趣的是,如果我在Runnable上post
,那么所有这些都有效。但是,当我这样做时,第二次打开片段B时会出现奇怪的闪烁。
那么,每次将片段B附加到其父Activity
时,如何让片段B自动滚动到顶部?我觉得我必须有一些令人目眩的明显错过,但我现在真的很难过。
答案 0 :(得分:1)
你正在调用正确的方法,但是你在错误的地方调用它们。
我假设你有代码在片段之间切换,你在A中单击一个项目时调用它。所以每当你进行切换时,将滚动设置到顶部,这些就是这些:
protected void switchList() {
ListFragment a = (ListFragment) getFragmentManager().findFragmentByTag("a");
ListFragment b = (ListFragment) getFragmentManager().findFragmentByTag("b");
b.getListView().setSelectionAfterHeaderView();
getFragmentManager().beginTransaction().hide(a).show(b).addToBackStack(null).commit();
}
还有一个重要注意事项:永远不要在活动中保留对片段的持久引用。每当你需要一个片段从FragmentManager获取它。这一点至关重要,因为在配置更改(如设备轮换,或暂停和恢复应用程序)时,会重新创建片段,并且您保留的引用会导致“死”片段。它不仅是一个重大泄漏,它还会阻止您的代码运行。您对保存的片段所做的任何更改都不会反映在屏幕上,因为屏幕会保存新创建的片段。