(copiato da mia risposta: smoothScrollToPositionFromTop() is not always working like it should)
Questo è un bug noto. Vedere https://code.google.com/p/android/issues/detail?id=36062
Tuttavia, ho implementato questa soluzione che si occupa di tutti i casi limite che potrebbero verificarsi:
Prima chiamata smothScrollToPositionFromTop(position)
e poi, quando ha finito di scorrimento, chiamare setSelection(position)
. Quest'ultima chiamata corregge lo scorrimento incompleto saltando direttamente nella posizione desiderata. In questo modo, l'utente ha ancora l'impressione di scorrere l'animazione verso questa posizione.
ho implementato questa soluzione entro due metodi di supporto:
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;
}
}
fonte
2014-08-13 12:48:08
e questo metodo non ha mai funzionato per me. –
Bug noto: vedere la risposta https://stackoverflow.com/questions/14479078/smoothscrolltopositionfromtop-is-not-always-working-like-it-should/20997828#20997828 –