Пачакаць пакуль smoothScrollToPosition ListView (у) сканчаецца

сфера

Мне трэба, каб перайсці да пэўнай пазіцыі плаўна, а затым «пераскочыць» на іншую пазіцыю з кодам <> setSelection (anotherPosition) . Гэта робіцца, каб стварыць ілюзію гладкай прагорткі (напрыклад) 100 элементаў у ListView . <Код> 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 з любым іншым адпаведным вялікім значэннем (гэта значыць, калі вашы погляды вельмі разнастайныя па памеры), вы атрымаеце дастаткова хуткі скрутак, які карыстальнік звычай апавяшчэння, калі вы пстрыкае з setSelection (0) у Runnable, што з'яўляецца postDelayed ў ListView.
дададзена аўтар 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
дададзена