如何滚动到ListFragment的顶部

时间:2014-09-12 01:04:42

标签: android android-fragments android-listfragment

我的情况:我有一个由一个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自动滚动到顶部?我觉得我必须有一些令人目眩的明显错过,但我现在真的很难过。

1 个答案:

答案 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获取它。这一点至关重要,因为在配置更改(如设备轮换,或暂停和恢复应用程序)时,会重新创建片段,并且您保留的引用会导致“死”片段。它不仅是一个重大泄漏,它还会阻止您的代码运行。您对保存的片段所做的任何更改都不会反映在屏幕上,因为屏幕会保存新创建的片段。