android: RecyclerView внутри ScrollView

У меня RecyclerView, завернутый в LinearLayout, и он отлично работает, как и ожидалось. Я вижу все данные в RecyclerView как заполненные. Все идет нормально.

Когда я оборачиваю LinearLayout в ScrollView, RecyclerView становится пустым. Я ничего не вижу внутри RecyclerView. Почему? Как заставить это работать.

Страница является одной из вкладок в ViewPagerIndicator, поэтому все на этой вкладке должно быть в ScrollView.

Спасибо за помощь.


person nomongo    schedule 26.08.2014    source источник
comment
Вы когда-нибудь находили ответ?   -  person athor    schedule 10.09.2014
comment
попробуйте: stackoverflow.com/questions/27083091 /   -  person Fabin Paul    schedule 12.09.2015
comment
вам нужно будет использовать один дочерний элемент scrollview, а другие представления вашего xml будут в этом единственном дочернем элементе. чтобы recyclerView работал с scrollview, вы должны указать высоту 0dp для вашего recyclerview в xml и указать максимальную высоту, которую ваш recyclerview может принимать во время выполнения. Вы можете рассчитать максимальную высоту, умножив общее количество строк на высоту одной строки (в dp) в случае вертикального recyclerView, а по горизонтали вы можете указать высоту только одного дочернего элемента. Например, если у нас есть 10 текстовых изображений по 40 dp каждое, тогда высота recyclerView по вертикали будет 10 * 40 dp = 400 dp и 10 dp для горизонтальной.   -  person Vatish Sharma    schedule 04.02.2016


Ответы (4)


Установите это свойство для ScrollView,

 android:fillViewport="true"

ScrollView расширится, чтобы заполнить содержимое

person Sathesh    schedule 27.01.2015
comment
У меня это сработало, но иногда возникало исключение NullPointerException. - person SilentKnight; 06.07.2015
comment
Буду признателен, если вы предоставите трассировку стека. - person Sathesh; 09.07.2015
comment
Не путайте с fitsSystemWindows="true" ребятами - person Jemshit Iskenderov; 02.09.2015

После проверки реализации причина оказалась в следующем. Если RecyclerView помещается в ScrollView, то на этапе измерения его высота не указана (потому что ScrollView допускает любую высоту) и, в результате, становится равной минимальной высоте (согласно реализации), которая, по-видимому, равна нулю.

У вас есть несколько способов исправить это:

  • Установите определенную высоту на RecyclerView
  • Установите ScrollView.fillViewport на true
  • Или оставьте RecyclerView вне ScrollView. На мой взгляд, это лучший вариант на сегодняшний день. Если RecyclerView высота не ограничена - что имеет место, когда она помещена в ScrollView - тогда все представления адаптера имеют достаточно места по вертикали и создаются сразу. Больше не существует повторного использования представлений, что как бы нарушает цель RecyclerView.
person sergej shafarenka    schedule 14.09.2014
comment
@beworker у меня есть 2 RecyclerView, и даже я даю определенные высоты, они не будут все видны в альбомной ориентации, поэтому RecyclerView внутри ScrollView становится необходимым - person Jemshit Iskenderov; 11.06.2015
comment
Идеальная точка. Таким образом, recyclerView внутри ScrollView можно заменить каким-нибудь контейнером статического представления. - person dasar; 15.09.2015

Мне ничего не помогало, кроме этого:

mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        int action = e.getAction();
        switch (action) {
        case MotionEvent.ACTION_MOVE:
            rv.getParent().requestDisallowInterceptTouchEvent(true);
            break;
    }
    return false;
}

@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {

}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
});

Я получил этот ответ здесь. Спасибо, Пиюш Гупта за это.

person kkost    schedule 28.04.2016
comment
У меня была похожая проблема. Я использовал Recyclerview внутри элементов Recyclerview. Внутренний Recyclerview вообще не прокручивал. Ваше решение сработало для меня. - person Khawar Raza; 20.03.2017

Надеюсь это поможет :

Добавьте эту строку в свой файл recyclerView xml:

android:nestedScrollingEnabled="false"

Попробуйте, recyclerview будет плавно прокручиваться с гибкой высотой внутри scrollview.

person iDeveloper    schedule 21.12.2016