15

範囲

特定の位置にスムーズにスクロールしてから、。を使用して別の位置に「ジャンプ」する必要がありsetSelection(anotherPosition)ます。これは、(たとえば)100アイテムのスムーズなスクロールの錯覚を作成するために行われますListViewsmoothScrollToPosition(100)長持ちしすぎます。

問題

setSelection()smoothScrollToPositionが作業を終了するまで待機しないため、setSelection()すぐに呼び出され、ユーザーにはクイックジャンプのみが表示されます。

コード

private final int scrollableItems = 20;

int firstVisiblePosition = mListView.getFirstVisiblePosition();
if (firstVisiblePosition < scrollableItems) {
    mListView.smoothScrollToPosition(0);
} else {
    mListView.smoothScrollToPosition(firstVisiblePosition - scrollableItems);
    mListView.setSelection(0);
}
mListView.clearFocus();

アイディア

OK、滑らかさの錯覚の論理を変更することができます:最初setSelection()に、次にスムーズにスクロールします(リストの一番上の最初の項目にスクロールします):

    int firstVisiblePosition = mListView.getFirstVisiblePosition();

    if (firstVisiblePosition < scrollableItems) {
        mListView.smoothScrollToPosition(0);
    } else {
        mListView.setSelection(scrollableItems);
        mListView.smoothScrollToPosition(0);
    }
    mListView.clearFocus();
4

2 に答える 2

24
final ListView listView = ...;
View listItemView = ...;
listView.smoothScrollBy(listItemView.getHeight() * NUMBER_OF_VIEWS, 
    DURATION * 2);
listView.postDelayed(new Runnable() {
    public void run() {
        listView.smoothScrollBy(0, 0); // Stops the listview from overshooting.
        listView.setSelection(0);
    }
}, DURATION);

もちろん、スクロールの方向などはユースケースに合わせて調整する必要があります(リストの一番上に移動します)

EDIT : スクロールの速度が速すぎると、古いソリューションがオーバーシュートする可能性がありました。

于 2011-10-28T12:13:29.180 に答える