(skopiowane z moją odpowiedź: smoothScrollToPositionFromTop() is not always working like it should)
To znany błąd. Zobacz https://code.google.com/p/android/issues/detail?id=36062
Jednak realizowane tego obejścia, która zajmuje się wszystkich przypadkach krawędzi, które mogą wystąpić:
najpierw wywołać smothScrollToPositionFromTop(position)
a potem, kiedy zakończy przewijanie, zadzwoń setSelection(position)
. To ostatnie wywołanie koryguje niekompletne przewijanie, przeskakując bezpośrednio do pożądanej pozycji. W ten sposób użytkownik nadal ma wrażenie, że jest przewijany w animacji do tej pozycji.
I wdrożone tego obejścia w ciągu dwóch metod pomocniczych:
smoothScrollToPosition()
public static void smoothScrollToPosition(final AbsListView view, final int position) {
View child = getChildAtPosition(view, position);
// There's no need to scroll if child is already at top or view is already scrolled to its end
if ((child != null) && ((child.getTop() == 0) || ((child.getTop() > 0) && !view.canScrollVertically(1)))) {
return;
}
view.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(final AbsListView view, final int scrollState) {
if (scrollState == SCROLL_STATE_IDLE) {
view.setOnScrollListener(null);
// Fix for scrolling bug
new Handler().post(new Runnable() {
@Override
public void run() {
view.setSelection(position);
}
});
}
}
@Override
public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount,
final int totalItemCount) { }
});
// Perform scrolling to position
new Handler().post(new Runnable() {
@Override
public void run() {
view.smoothScrollToPositionFromTop(position, 0);
}
});
}
getChildAtPosition()
public static View getChildAtPosition(final AdapterView view, final int position) {
final int index = position - view.getFirstVisiblePosition();
if ((index >= 0) && (index < view.getChildCount())) {
return view.getChildAt(index);
} else {
return null;
}
}
i ta metoda nigdy nie zadziałała u mnie. –
Znany błąd: Zobacz odpowiedź https://stackoverflow.com/questions/14479078/smoothscrolltopositionfromtop-is-not-always-working-like-it-should/20997828#20997828 –