Android Wait unitl ListView';s smoothScrollToPosition()完成 范围

Android Wait unitl ListView';s smoothScrollToPosition()完成 范围,android,listview,smooth-scrolling,Android,Listview,Smooth Scrolling,我需要平滑地滚动到某个位置,然后使用setSelection(另一个位置)跳转到另一个位置。这样做是为了在列表视图中创建(例如)100个项目平滑滚动的幻觉平滑滚动位置(100)持续时间太长,你知道 问题 setSelection()不会等到SmoothScrollTopositon完成它的工作,所以setSelection()会立即被调用,用户只能看到快速跳转 代码 当然,滚动方向等需要根据您的用例进行调整(转到列表顶部) 编辑:如果滚动速度过高,旧的解决方案可能会超调,smoothScroll

我需要平滑地滚动到某个位置,然后使用
setSelection(另一个位置)
跳转到另一个位置。这样做是为了在
列表视图中创建(例如)100个项目平滑滚动的幻觉<代码>平滑滚动位置(100)
持续时间太长,你知道

问题
setSelection()
不会等到
SmoothScrollToposito
n完成它的工作,所以
setSelection()
会立即被调用,用户只能看到快速跳转

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


编辑:如果滚动速度过高,旧的解决方案可能会超调,smoothScrollBy(0,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();
private final int scrollableItems=20;
int firstVisiblePosition=mListView.getFirstVisiblePosition();
if(firstVisiblePosition
但它可能仅适用于具有固定高度项目的列表。我认为mListView.setSelection(scrollableItems);mListView.smoothScrollToPosition(0);更可取的方法;)是的,它只是用来获得合适的高速。只要将视图的高度*数量替换为任何其他适当大的值(即,如果视图的大小变化很大),您将获得足够快的滚动,当您使用Runnable中的setSelection(0)捕捉到ListView时,用户不会注意到。
    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);
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();