Прокрутите вверх страницы в RecyclerView с помощью LinearLayoutManager
У меня есть фрагмент, в котором есть RecyclerView
с LinearLayoutManager
, в котором есть элементы CardView
. Нажатие кнопки плавающего действия, по которой элементы должны прокручиваться вверх. Я попытался использовать scrollToPosition
, а также scrollToPositionWithOffset
с RecyclerView
, а также с LinearLayoutManager
, как показано ниже. Но это не имеет никакого эффекта. Почему это так? Кто-нибудь может помочь мне.
И я разместил RecyclerView
непосредственно внутри SwipeRefreshView
в XML файле. Я звоню setFloatingActionButton
, как только установлен адаптер на RecyclerView
.
public void setFloatingActionButton(final View view) {
float = (android.support.design.widget.FloatingActionButton) getActivity().findViewById(R.id.float);
float.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mRecyclerView.smoothScrollToPosition(0);
android.support.design.widget.Snackbar.make(view, "Scrolled to Top", android.support.design.widget.Snackbar.LENGTH_SHORT)
.setAction("Ok", new View.OnClickListener() {
@Override
public void onClick(View v) {
LinearLayoutManager llm = (LinearLayoutManager) mRecyclerView.getLayoutManager();
llm.scrollToPosition(0);
}
})
.setActionTextColor(getActivity().getResources().getColor(R.color.coloLink))
.show();
}
});
}
Ответы
Ответ 1
Продолжая вышеприведенные комментарии, в идеале, заменяя
mRecyclerView.smoothScrollToPosition(0);
в onClick
кнопки с плавающим действием с
mLayoutManager.scrollToPositionWithOffset(0, 0);
должен работать. Вы также можете удалить код SnackBar
, потому что он вам не нужен. Итак, весь ваш метод должен выглядеть как
public void setFloatingActionButton(final View view) {
float actionButton = (android.support.design.widget.FloatingActionButton) getActivity()
.findViewById(R.id.float);
actionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView
.getLayoutManager();
layoutManager.scrollToPositionWithOffset(0, 0);
}
});
}
И если вы скажете, что вышеописанное не работает, тогда проверьте, что вызов onClick()
даже вызван или нет. Попробуйте добавить в него сообщение журнала и посмотреть, напечатан ли его.
Ответ 2
Использование метода smoothScrollToPosition()
работало для меня с новейшей версией Android.
layoutManager.smoothScrollToPosition(mRecyclerView, null, 0);
Ответ 3
Вызвать 'scrollToPosition (0)', используя это:
public void scrollToPosition(final int position) {
if (mRecyclerView != null) {
getHandler().post(new Runnable() {
@Override
public void run() {
mRecyclerView.scrollToPosition(position);
if (position == 0) {
LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
layoutManager.scrollToPositionWithOffset(0, 0);
mScrollView.fullScroll(View.FOCUS_UP);
}
}
});
}
}
Ответ 4
В моем случае требовалось заполнить представление в обратном порядке, чтобы макет отображал вид снизу вида с прокруткой.
layoutManager.smoothScrollToPosition(mRecyclerView, null, 'last_index')
действительно не помогло.
Моя проблема была решена, когда я сделал вид переработчика, чтобы показать ребенка на последней позиции
recyclerView.scrollToPosition(length-1)