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

主意

好的,我们可以改变平滑错觉的逻辑:首先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);

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

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

于 2011-10-28T12:13:29.180 回答
0

另一种方法是添加一个 OnScrollListener。

private final int scrollableItems = 20;

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

    mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
      @Override
      public void onScrollStateChanged(AbsListView absListView, int i) {
        if (i == SCROLL_STATE_IDLE) {
          mListView.setSelection(0);
           }
      }
   })

   mListView.smoothScrollToPosition(firstVisiblePosition - scrollableItems);
}
mListView.clearFocus();
于 2018-05-27T05:40:58.747 回答