RecyclerView внутри SwipeRefreshLayout внутри NestedScrollViewLayout не может прокручиваться

У меня есть активность с рушащейся панелью инструментов и вложенным представлением прокрутки с помощью FrameLayout которые я FrameLayout фрагменты. Первоначально я размещаю в нем FragmentA с CardView .

Прекрасно работает. Когда я нажимаю кнопку, хотя я заменяю FragmentB другим, содержащим RecyclerView .

Когда я добавляю FragmentB я наклоняю прокрутку в нижней части списка.

Это видео показывает проблему: LINK TO VIDEO

Схема расположения хостов:

 <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="340dp" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:fitsSystemWindows="true"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_scrollFlags="scroll|exitUntilCollapsed|enterAlwaysCollapsed" android:fitsSystemWindows="true" app:contentScrim="?attr/colorPrimary" app:expandedTitleMarginStart="48dp" app:expandedTitleMarginEnd="64dp"> ......... ...... </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="fill_vertical" android:fillViewport="true" app:layout_behavior="@string/appbar_scrolling_view_behavior" > <!-- the layout which will be the content of the activity (which will be hosted inside the drawer (NOT the list of the drawer)) --> <FrameLayout android:id="@+id/frame_container" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_behavior="@string/appbar_scrolling_view_behavior" > </FrameLayout> </android.support.v4.widget.NestedScrollView> 

Макет FragmentB:

 <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/contentView" android:layout_width="match_parent" android:layout_height="wrap_content" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <android.support.v7.widget.RecyclerView android:id="@+id/rv_users" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:layout_width="match_parent" android:layout_height="wrap_content" /> <include layout="@layout/view_progress" /> <include layout="@layout/view_retry" /> <!--</LinearLayout>--> </android.support.v4.widget.SwipeRefreshLayout> 

Solutions Collecting From Web of "RecyclerView внутри SwipeRefreshLayout внутри NestedScrollViewLayout не может прокручиваться"

Вы помещаете RecyclerView внутри NestedScrollView .
Я думаю, лучшее решение – иметь NestedScrollView или RecyclerView но не оба, потому что RecyclerView уже реализует NestedScrollingChild .

У меня похожая компоновка в моем приложении. Я сделал то же самое – поместите RecyclerView в FrameLayout, а затем внутри NestedScrollView. Это прекрасная работа. Без NestedScrollView все работает нормально.

Я думаю, что это проблема с прокруткой, customview расширяет ListView или RecycleView. Это мой зол:

 public class RewriteListView extends ListView { public RewriteListView(Context context) { super(context); } public RewriteListView(Context context, AttributeSet attrs) { super(context, attrs); } public RewriteListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } 

}

будь счастлив 🙂

Уже ответили! Два прокручиваемых элемента (например, RecycleView и NestedScrollView в вашем вопросе) не могут работать вместе.

Измените макет своей деятельности.

 <ParentLayout> ....... <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="340dp" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:fitsSystemWindows="true"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_scrollFlags="scroll|exitUntilCollapsed|enterAlwaysCollapsed" android:fitsSystemWindows="true" app:contentScrim="?attr/colorPrimary" app:expandedTitleMarginStart="48dp" app:expandedTitleMarginEnd="64dp"> ......... ...... </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> //THIS FRAGMENT WILL BE REPLACED! <FrameLayout android:id="@+id/frame_container" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_behavior="@string/appbar_scrolling_view_behavior" > </FrameLayout> ....... </ParentLayout> 

И чем по умолчанию в первом запуске этого действия – заменил FrameLayout выше – на ваш первый фрагмент с помощью NestedScrollView (вам нужно создать новый фрагмент для замены) и после замены щелчка на фрагмент в вашем Вопросе.

Две вещи:

Прежде всего, вам не нужно встраивать свой контейнер фрагмента в NestedScrollView если вы хотите прокручивать поведение в своей деятельности.

Поместите FrameLayout прямо в макет координатора с атрибутом layout_behavior в нем, а затем просто поместите любой фрагмент с прокруткой View (и ему не нужно иметь layout_behavior attr).

Итак, в вашем примере вам придется обрезать фрагменты:

FragmentA который имеет макет с CardView внутри NestedScrollView FragmentB с RecyclerView внутри SwipeRefreshLayout

Другая проблема заключается в том, что вы помещаете более одного ребенка в SwipeRefreshLayout , и, как указано в документации, у него должен быть только один прямой ребенок. источник