范围
我需要平滑滚动到某个位置,然后使用setSelection(anotherPosition)“跳转”到另一个位置。这样做是为了营造一种流畅滚动ListView中(例如)100个项目的错觉。您知道smoothScrollToPosition(100)持续太久了。
问题setSelection()不会等到smoothScrollToPositio n完成其工作,因此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();
主意
好的,我们可以更改平滑效果错觉的逻辑:首先setSelection(),然后平滑滚动(我们正在滚动到列表顶部的第一项):
    int firstVisiblePosition = mListView.getFirstVisiblePosition();

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

最佳答案

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);

当然,滚动方向等需要针对您的用例进行调整(转到列表顶部)

编辑:如果滚动的速度太高,旧的解决方案可能会过冲,smoothScrollBy(0,0)将停止平滑滚动,然后正确并立即设置选择。

关于android - 等待ListView smoothScrollToPosition()完​​成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7928820/

10-11 14:35