(Скопировано из моего ответа: smoothScrollToPositionFromTop() не всегда работает как надо)
Это известная ошибка. См. https://code.google.com/p/android/issues/detail?id=36062
Однако я реализовал этот обходной путь, который касается всех крайних случаев, которые могут возникнуть:
Сначала вызовите smothScrollToPositionFromTop(position)
, а затем, когда прокрутка закончится, вызовите setSelection(position)
. Последний вызов исправляет неполную прокрутку, переходя прямо в нужную позицию. При этом у пользователя по-прежнему создается впечатление, что он прокручивается с помощью анимации до этой позиции.
Я реализовал этот обходной путь с помощью двух вспомогательных методов:
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);
}
});
}
получить дочернюю позицию()
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;
}
}
person
Lars Blumberg
schedule
13.08.2014