4

我在 Fragment 中有一个 ListView,它作为选项卡添加到 ViewPager 中。我希望用户能够通过简单地点击他们已经在的选项卡(onTabReselected())来滚动“backToTop”。我已经有一个工作代码来做到这一点;但是,我使用的代码需要太长时间才能滚动回位置 0,这在小型列表中非常简洁,但在 250 首歌曲的集合中,它肯定会惹恼用户。

这是我的代码:

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
    switch (tab.getPosition()) {
    case 0:
        if (tab.getPosition() == mCurPagerItem) {
            final ListView list = (ListView) findViewById(android.R.id.list);
            list.smoothScrollToPosition(0);
        }
        break;
    case 1: 
        if (tab.getPosition() == mCurPagerItem) {
            final GridView list = (GridView) findViewById(R.id.artist_grid);
            list.smoothScrollToPosition(0);
        }
        break;
    case 2:
        if (tab.getPosition() == mCurPagerItem) {
            final ExpandableListView list = (ExpandableListView) findViewById(R.id.exp_list);
            list.smoothScrollToPosition(0);
        }
        break;
    default:
        break;
    }
}

当我的不同片段具有不同的“列表”类型时,我在位置之间切换。正如我所说,这段代码运行良好,但是有没有更快的方法来滚动回到顶部?那是更即时的东西。

澄清一下,当我说它“花费太长时间”时,那是因为smoothScrollToPosition本身就是一种在列表上滚动的缓慢方式,据说是为了让它看起来更好看。

注意我确实尝试过:

list.scrollTo(0, 0);

但这实际上似乎对 listView 的当前位置没有任何作用。我想这更像是一个 View 调用,一个 ListView 方法本身。

有任何想法吗?

4

2 回答 2

5

尝试调用setSelection(),它不执行任何动画:

list.setSelection(0);
于 2012-12-22T19:52:46.860 回答
4
int position = 10; // 10 or other

if (list.getFirstVisiblePosition() > position) {
    list.setSelection(position);
    list.smoothScrollToPosition(0);
} else {
    list.smoothScrollToPosition(0);
}

更新时间:2013-10-27 从 API 级别 11,您可以使用smoothScrollToPositionFromTop (int position, int offset, int duration)

于 2013-01-08T07:43:17.130 回答