Я выполнил горизонтальную прокручиваемую RecyclerView
. Мой RecyclerView
использует LinearLayoutManager
, и проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь использовать scrollToPosition(position)
или smoothScrollToPosition(position)
или из LinearLayoutManager
scrollToPositionWithOffset(position)
. Ни для меня не работает. Либо вызов прокрутки не прокручивается до нужного места, либо не вызывает OnScrollListener
.
До сих пор я пробовал так много разных комбинаций кода, что я не могу публиковать их здесь. Ниже приводится работа, которая работает для меня (но только частично):
public void smoothUserScrollTo(final int position) {
if (position < 0 || position > getAdapter().getItemCount()) {
Log.e(TAG, "An attempt to scroll out of adapter size has been stopped.");
return;
}
if (getLayoutManager() == null) {
Log.e(TAG, "Cannot scroll to position a LayoutManager is not set. " +
"Call setLayoutManager with a non-null layout.");
return;
}
if (getChildAdapterPosition(getCenterView()) == position) {
return;
}
stopScroll();
scrollToPosition(position);
if (lastScrollPosition == position) {
addOnLayoutChangeListener(new OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
if (left == oldLeft && right == oldRight && top == oldTop && bottom == oldBottom) {
removeOnLayoutChangeListener(this);
updateViews();
// removing the following line causes a position - 3 effect.
scrollToView(getChildAt(0));
}
}
});
}
lastScrollPosition = position;
}
@Override
public void scrollToPosition(int position) {
if (position < 0 || position > getAdapter().getItemCount()) {
Log.e(TAG, "An attempt to scroll out of adapter size has been stopped.");
return;
}
if (getLayoutManager() == null) {
Log.e(TAG, "Cannot scroll to position a LayoutManager is not set. " +
"Call setLayoutManager with a non-null layout.");
return;
}
// stopScroll();
((LinearLayoutManager) getLayoutManager()).scrollToPositionWithOffset(position, 0);
// getLayoutManager().scrollToPosition(position);
}
Я выбрал scrollToPositionWithOffset()
из-за этого, но дело может быть другим, поскольку я использую LinearLayoutManager вместо GridLayoutManager. Но решение действительно работает и для меня, но, как я сказал ранее, только частично.
- Когда вызов для прокрутки от 0-й позиции до totalSize-7 прокрутки работает как шарм.
- Когда свиток от totalSize - 7 до totalSize - 3, первый раз я прокручиваю только до 7-го последнего элемента в списке. Во второй раз, однако, я могу прокрутить отлично
- При прокрутке с totalSize - 3 на totalSize, я начинаю получать неожиданное поведение.
Если кто-нибудь нашел работу, я бы ее оценил. Здесь gist в мой код пользовательского ReyclerView
.