как сохранить RecyclerView всегда прокручивать вниз

Я использую Recyclerview Заменить на список. Я хочу, чтобы Recyclerview всегда прокручивался вниз.

ListView может использовать этот метод setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL)

RecyclerView использую метод smoothScrollToPosition(myAdapter.getItemCount() - 1)

но когда мягкая клавиатура всплывает, она заменяет содержимое RecyclerView.


person lj wang    schedule 19.11.2014    source источник
comment
Вы решили проблему наконец? Я считаю, что setReverseLayout в true приведет к тому, что элемент будет отображаться сверху вниз, это не подходит для чата.   -  person CodeAlien    schedule 04.09.2015
comment
вы можете попробовать мой ответ: stackoverflow.com/a/43647835/6482350   -  person DysaniazzZ    schedule 28.04.2017


Ответы (5)


Это связано с тем, что RV считает свою контрольную точку ВЕРХНЕЙ, и когда появляется клавиатура, размер RV обновляется родителем, и RV сохраняет свою контрольную точку стабильной. (таким образом сохраняет верхнюю позицию в том же месте)

Вы можете установить для LayoutManager#ReverseLayout значение true, и в этом случае RV будет размещать элементы с конца адаптера.

например положение адаптера 0 внизу, 1 над ним и т.д...

Это, конечно, потребует от вас изменить порядок вашего адаптера.

Я не уверен, но установка стека с конца может также даст вам тот же результат без повторного заказа вашего адаптера.

person yigit    schedule 21.11.2014
comment
спасибо, вы решаете мою проблему. я использую параметр reverseLayout - person lj wang; 21.11.2014
comment
Содержимое макета было перевернуто, но список не прокручивался до конца. Даже stackFromBottom не помог. - person Codevalley; 02.02.2015
comment
Просто дополнение: иногда настройка stackFromEnd в XML не работает, а вызов метода в коде работает. - person guness; 16.12.2015
comment
Если вы установите как stackFromEnd=true, так и setReverseLayout=true, это не сработает. Кто-нибудь знает обходной путь? - person Luccas Correa; 22.01.2016
comment
@LuccasCorrea Как ты заставил это работать? Я использовал llm.setStackFromEnd(true); и mRecyclerView.scrollToPosition(mItemsList.size() - 1); при добавлении элемента в конец списка. Дайте мне знать, если вы нашли какой-либо другой способ. - person Nitin Sethi; 24.03.2016
comment
mlinearLayoutManager.setStackFromEnd (истина); действительно помог исправить открытие клавиатуры recyclerView .. Спасибо, чувак .. :) - person Meet Vora; 16.06.2016
comment
В моем случае я устанавливаю для reverseLayout и stackFromEnd значение true и сортирую данные в обратном порядке, что работает так же, как список чата. - person Evi Song; 04.03.2018
comment
Я поставил reverseLayout и stackFromEnd и отсортировал данные в обратном порядке - все перевернулось, но до конца не прокручивается. - person User; 28.02.2020

Если вы хотите, чтобы положение прокрутки было привязано к нижней части RecyclerView, это полезно в приложениях для чата. просто вызовите setStackFromEnd(true) на LinearLayoutManager, чтобы клавиатура сохраняла элементы списка привязанными к нижней части (клавиатуре), а не к верхней.

person Kirill Kulakov    schedule 17.03.2016
comment
Работает только в первый раз для меня ... и да, я делаю приложение для чата - person prateek31; 01.12.2016
comment
Это сработало. Установка этого в файле xml не сработала. - person Samuel Robert; 23.01.2017
comment
@larrytech разве не было ясно из ответа, который следует вызывать на LinearLayoutManager? - person Kirill Kulakov; 21.02.2017
comment
Это не работает. Он перевернут, но не прокручивается вниз. - person User; 28.02.2020

Я столкнулся с той же проблемой и решил ее, используя упомянутый подход здесь. Он используется для определения того, открыта программная клавиатура или нет, и если она открыта, просто вызовите метод smoothScrollToPosition().

Гораздо более простое решение - дать корневому представлению вашей активности известный идентификатор, скажем, "@+id/activityRoot", подключить GlobalLayoutListener к ViewTreeObserver и оттуда вычислить разницу в размере между корнем представления вашей активности и размером окна:

final View activityRootView = findViewById(R.id.activityRoot);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
    int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
    if (heightDiff > 100) { 
        recyclerView.smoothScrollToPosition(myAdapter.getItemCount() - 1);
    }
 }
});

Легкий!

person Krishna Kalubandi    schedule 09.01.2016
comment
это работает лучше всего из всех ответов на этой странице, однако при реализации кода обязательно проверьте, что myAdapter.getItemCount() > 0 В противном случае, когда приложение запускается без элементов в списке, оно падает, потому что пытается прокрутить до позиции -1 - person Someone Somewhere; 16.04.2019

Я также столкнулся с той же проблемой. Но следующий код мне поможет. Я надеюсь, что это полезно.

В этом статусе находится арралист.

 recyclerView.scrollToPosition(staus.size()-1);

следующий: - В этом вы можете использовать класс адаптера

   recyclerView.scrollToPosition(showAdapter.getItemCount()-1);
person Shivam Sharma    schedule 18.11.2016

person    schedule
comment
Это не работает, когда пользователи немного прокручивают вверх и хотят оставаться такими же для любого последнего видимого элемента. - person John Pang; 08.01.2017