4

フラグメント内に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位置、intオフセット、int期間)を使用できます

于 2013-01-08T07:43:17.130 に答える