ListViewのsmoothScrollToPosition()が完了するのを待つ

範囲

<コード> setSelection(anotherPosition)でスムーズにスクロールして別の位置にジャンプする必要があります。これは、<コード> ListView で100項目の円滑なスクロールの錯覚を作成するために行われます。 <コード> smoothScrollToPosition(100)が長すぎます。

問題

<コード>setSelection() doesn't wait till <コード>smoothScrollToPosition finishes its work, so <コード>setSelection() is being called immediately and user sees quick jumping only;

コード

<コード>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, we could change logic of smoothness illusion: first <コード>setSelection(), then scroll smoothly (we're scrolling to the very first item on top of the list):

<コード>    int firstVisiblePosition = mListView.getFirstVisiblePosition();

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

2 答え

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: Old solution could overshoot if the velocity of the scroll was too high, smoothScrollBy(0,0) will stop the smooth scrolling before setting the selection properly and immediately.

24
追加された
うん、それは唯一の適切な高速を得るために使用されます。高さ* NUMBER_OF_VIEWSを他の適切な大きさの値に置き換えている限り(つまり、ビューのサイズが非常に異なる場合)、RunnableでsetSelection(0)を使用してスナップするときにユーザーが気付かないほど速くスクロールしますはListViewにpostDelayedされています。
追加された 著者 Jens,
レスポンスありがとう!
追加された 著者 Aleksey Malevaniy,
しかし、固定された高さの項目を持つリストのための解決策になる可能性があります。私は、mListView.setSelection(scrollableItems)と思う。 mListView.smoothScrollToPosition(0);まだもっと好ましい方法です;)
追加された 著者 Aleksey Malevaniy,

別の方法は、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();
0
追加された