Я хотел бы прокрутить до конца списка RecyclerView после загрузки действия.
GENERIC_MESSAGE_LIST = (ArrayList) intent.getExtras().getParcelableArrayList(ConversationsAdapter.EXTRA_MESSAGE);
conversationView = (RecyclerView) findViewById(R.id.list_messages);
conversationView.setHasFixedSize(true);
conversationViewLayoutManager = new LinearLayoutManager(this);
conversationView.setLayoutManager(conversationViewLayoutManager);
conversationViewAdapter = new ConversationAdapter(GENERIC_MESSAGE_LIST, this);
conversationView.setAdapter(conversationViewAdapter);
conversationView.scrollTo(...)
выдает исключение о том, что он не поддерживается в RecyclerView, и conversationView.scrollToPosition(...)
, похоже , ничего не делает.
После вышеупомянутого блока кода я добавил
conversationView.scrollToPosition(GENERIC_MESSAGE_LIST.size() + 1)
который не работает. Есть 30 элементов в GENERIC_MESSAGE_LIST
.
java
android
scroll
android-recyclerview
waylaidwanderer
источник
источник
scrollToPosition
сразу после установки адаптера?conversationView.setAdapter(conversationViewAdapter);
.Ответы:
Просто установите
setStackFromEnd=true
илиsetReverseLayout=true
так, чтобы LLM размещал элементы с конца.Разница между этими двумя заключается в том, что
setStackFromEnd
в представлении будет отображаться последний элемент, направление макета останется прежним. (Таким образом, в горизонтальном представлении Recycler слева направо будет показан последний элемент, а при прокрутке влево будут отображены более ранние элементы)Принимая во внимание,
setReverseLayout
что изменится порядок элементов, добавленных адаптером. Компоновка начнется с последнего элемента, который будет самым левым в представлении LTR Recycler, а затем при прокрутке вправо отобразятся более ранние элементы.Образец:
Смотрите документацию для деталей.
источник
Я искал этот пост, чтобы найти ответ, но ... я думаю, что все в этом посте столкнулись с тем же сценарием, что и я:
scrollToPosition()
был полностью проигнорирован по очевидной причине.Что я использовал?
... что РАБОТАЕТ ?
источник
recyclerView.scrollToPosition(messages.size()-1);
действительно работает для меня, мне просто интересно, причина.smoothScrollToPosition(...)
.Я знаю, что уже поздно, чтобы ответить здесь, но если кто-то хочет знать решение ниже
источник
conversationView.smoothScrollToPosition(conversationView.getAdapter().getItemCount() **-1**);
поскольку позиции в списках начинаются с нуля.Для прокрутки вниз из любой позиции в обзоре переработчика вниз
источник
Добавьте этот код после отправки сообщения и до получения сообщения с сервера
источник
Когда вы звоните
setAdapter
, это не сразу раскладывает и не позиционирует элементы на экране (что занимает один проход макета), следовательно, вашscrollToPosition()
звонок не имеет фактических элементов для прокрутки, когда вы его вызываете.Вместо этого вы должны зарегистрировать ViewTreeObserver.OnGlobalLayoutListener (через addOnGlobalLayoutListner () от
ViewTreeObserver
созданногоconversationView.getViewTreeObserver()
), который задерживает вашеscrollToPosition()
до первого прохода макета:источник
OnGlobalLayoutListener
вероятно, не удаляется, потому что вы проверяетеvto.isAlive()
. Я не знаю причину, ноViewTreeObserver
иногда меняется дляView
, так что вместо проверкиisAlive
вам лучше просто получить токViewTreeObserver
сconversationView.getViewTreeObserver().removeGlobalOnLayoutListener
Решение для Котлина :
применять приведенный ниже код после настройки «recyclerView.adapter» или после «recyclerView.adapter.notifyDataSetChanged ()»
источник
В Котлине:
источник
GlobalLayoutListener
! После рефакторинга мне пришлось использовать ваш метод для прокрутки. Не забудьте удалить прослушиватель, как в stackoverflow.com/questions/28264139/… , иначе вы не прокрутите RecyclerView обратно к началу.и
код выше работает, но это не гладко и не круто.
источник
Если у вас есть адаптер, подключенный к recyclerView, просто сделайте это.
mRecyclerView.smoothScrollToPosition(mRecyclerView.getAdapter().getItemCount());
источник
Ответ Roc - большая помощь. Я хотел бы добавить небольшой блок к нему:
источник
В моем случае, когда представления не имеют одинаковую высоту, вызов scrollToPosition в LayoutManager работал для того, чтобы действительно прокрутить до конца и полностью увидеть последний элемент:
источник
Первая прокрутка при первом входе в режим рециркуляции, затем используйте
положить в минус для прокрутки вниз для прокрутки вверх (положительное значение);
если вид очень большой по высоте, то для верхней части вида используется конкретное смещение scrolltoposition, тогда вы используете
источник
Это прекрасно работает для меня:
источник
Только ответ Яна смог сделать мой
RecyclerView
свиток до указанной позиции. Тем не менее, яRecyclerView
не смог прокрутить потом, когда я использовалscrollToPosition()
.smoothScrollToPosition()
работал, но первоначальная анимация делала его слишком медленным, когда список был длинным. Причина была в том, что слушатель не был удален. Я использовал код ниже, чтобы удалить текущий,ViewTreeObserver
и он работал как шарм.источник
этот код даст вам последнее сообщение первым, я думаю, что этот ответ полезен.
источник
Пробовал метод @galex , он работал до рефакторинга. Поэтому я использовал ответ @yanchenko и немного изменился. Вероятно, это потому, что я вызвал прокрутку из того места
onCreateView()
, где было построено представление фрагментов (и, вероятно, не имело правильного размера).Вы также можете добавить проверку
viewTreeObserver.isAlive
как в https://stackoverflow.com/a/39001731/2914140 .источник
Если ничего из этого не сработало,
Вы должны попытаться использовать:
Делая это, вы запрашиваете определенный ConstraintLayout (или все, что у вас есть) для отображения. Свиток мгновенный.
Я работаю даже с показанной клавиатурой.
источник