Intereting Posts

Как использовать RecyclerView внутри NestedScrollView?

Как использовать RecyclerView внутри NestedScrollView ? Содержимое RecyclerView не отображается после установки адаптера.

Обновлен код макета UPDATE .

 <android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="@dimen/keyline_1"> </RelativeLayout> <View android:id="@+id/separator" android:layout_width="match_parent" android:layout_height="1dp" android:background="#e5e5e5" /> <android.support.v7.widget.RecyclerView android:id="@+id/conversation" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </android.support.v4.widget.NestedScrollView> 1 <android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="@dimen/keyline_1"> </RelativeLayout> <View android:id="@+id/separator" android:layout_width="match_parent" android:layout_height="1dp" android:background="#e5e5e5" /> <android.support.v7.widget.RecyclerView android:id="@+id/conversation" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </android.support.v4.widget.NestedScrollView> 

Замените ваш recyclerView,

 <android.support.v7.widget.RecyclerView android:id="@+id/conversation" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:layout_width="match_parent" android:layout_height="wrap_content" /> 

Вот,

 app:layout_behavior="@string/appbar_scrolling_view_behavior" 

Будет управлять остальными вещами.

Еще одна вещь, не нужно ставить ваш recyclerView внутри NestedScrollView

Вы можете использовать RecyclerView внутри NestedScrollView . Прежде всего, вы должны реализовать свой собственный LinearLayoutManager , он заставит RecyclerView обернуть его содержимое. Например:

 public class WrappingLinearLayoutManager extends LinearLayoutManager { public WrappingLinearLayoutManager(Context context) { super(context); } private int[] mMeasuredDimension = new int[2]; @Override public boolean canScrollVertically() { return false; } @Override public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) { final int widthMode = View.MeasureSpec.getMode(widthSpec); final int heightMode = View.MeasureSpec.getMode(heightSpec); final int widthSize = View.MeasureSpec.getSize(widthSpec); final int heightSize = View.MeasureSpec.getSize(heightSpec); int width = 0; int height = 0; for (int i = 0; i < getItemCount(); i++) { if (getOrientation() == HORIZONTAL) { measureScrapChild(recycler, i, View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), heightSpec, mMeasuredDimension); width = width + mMeasuredDimension[0]; if (i == 0) { height = mMeasuredDimension[1]; } } else { measureScrapChild(recycler, i, widthSpec, View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), mMeasuredDimension); height = height + mMeasuredDimension[1]; if (i == 0) { width = mMeasuredDimension[0]; } } } switch (widthMode) { case View.MeasureSpec.EXACTLY: width = widthSize; case View.MeasureSpec.AT_MOST: case View.MeasureSpec.UNSPECIFIED: } switch (heightMode) { case View.MeasureSpec.EXACTLY: height = heightSize; case View.MeasureSpec.AT_MOST: case View.MeasureSpec.UNSPECIFIED: } setMeasuredDimension(width, height); } private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec, int heightSpec, int[] measuredDimension) { View view = recycler.getViewForPosition(position); if (view.getVisibility() == View.GONE) { measuredDimension[0] = 0; measuredDimension[1] = 0; return; } // For adding Item Decor Insets to view super.measureChildWithMargins(view, 0, 0); RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams(); int childWidthSpec = ViewGroup.getChildMeasureSpec( widthSpec, getPaddingLeft() + getPaddingRight() + getDecoratedLeft(view) + getDecoratedRight(view), p.width); int childHeightSpec = ViewGroup.getChildMeasureSpec( heightSpec, getPaddingTop() + getPaddingBottom() + getDecoratedTop(view) + getDecoratedBottom(view), p.height); view.measure(childWidthSpec, childHeightSpec); // Get decorated measurements measuredDimension[0] = getDecoratedMeasuredWidth(view) + p.leftMargin + p.rightMargin; measuredDimension[1] = getDecoratedMeasuredHeight(view) + p.bottomMargin + p.topMargin; recycler.recycleView(view); } } 

После этого используйте этот LayoutManager для вашего RecyclerView

 recyclerView.setLayoutManager(new WrappingLinearLayoutManager(getContext())); 

Но вы также должны назвать эти два метода:

 recyclerView.setNestedScrollingEnabled(false); recyclerView.setHasFixedSize(false); 

Здесь setNestedScrollingEnabled(false) отключает прокрутку для RecyclerView , поэтому он не перехватывает прокручивание события из NestedScrollView . И setHasFixedSize(false) определяет, что изменения в содержимом адаптера могут изменить размер RecyclerView

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

Обновление №1:

В некоторых случаях это решение немного затруднительно и имеет проблемы с производительностью, поэтому, если у вас много элементов в RecyclerView я бы рекомендовал использовать пользовательскую реализацию списка на основе LinearLayout , создать для него аналоговый адаптер и заставить его вести себя Как ListView или RecyclerView

Обновление №2 (важно!):

В Android Support Library 23.2.0 для LayoutManagers был добавлен метод setAutoMeasureEnabled(true) . Это позволяет RecyclerView обертывать контент и работает как шарм.
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html

1) Вам необходимо использовать библиотеку поддержки 23.2.0 (или) выше

2), а высота recyclerView будет wrap_content.

3) recyclerView.setNestedScrollingEnabled (false)

Но при этом шаблон recycler не работает. (Т. Е. Все представления будут загружены сразу, потому что wrap_content требуется высота полного recyclerView, чтобы он сразу рисовал все виды ресайклеров. Никакое представление не будет переработано). Старайтесь не использовать этот шаблон, если это действительно не требуется. Попробуйте использовать viewType и добавьте все другие виды, которые нужно прокрутить до recyclerView

Вы можете использовать android:fillViewport="true" чтобы NestedScrollView RecyclerView . RecyclerView заполнит оставшуюся высоту. Поэтому, если вы хотите прокрутить NestScrollView , вы можете установить minHeight RecyclerView .

Это то, что работает для меня

 <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <android.support.v7.widget.RecyclerView android:id="@+id/rv_recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_behavior="@string/appbar_scrolling_view_behavior"/> </android.support.v4.widget.NestedScrollView> 

Просто добавьте recyclerView.setNestedScrollingEnabled(false); Прежде чем setAdapter сам работал для меня. Я не добавлял app:layout_behavior="@string/appbar_scrolling_view_behavior" любом месте и не устанавливал какой-либо пользовательский менеджер макетов

 <android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/white" android:text="Some Text..." android:padding="15dp" /> </LinearLayout> <LinearLayout android:orientation="vertical" android:padding="15dp" android:layout_marginTop="10dp" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Quick Links" android:textColor="@color/black" android:textStyle="bold" android:textAllCaps="true" android:paddingLeft="20dp" android:drawableLeft="@drawable/ic_trending_up_black_24dp" android:drawablePadding="10dp" android:layout_marginBottom="10dp" android:textSize="16sp"/> <View android:layout_width="fill_parent" android:layout_height="1dp" android:background="#efefef"/> <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> </LinearLayout> </android.support.v4.widget.NestedScrollView> 1 <android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/white" android:text="Some Text..." android:padding="15dp" /> </LinearLayout> <LinearLayout android:orientation="vertical" android:padding="15dp" android:layout_marginTop="10dp" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Quick Links" android:textColor="@color/black" android:textStyle="bold" android:textAllCaps="true" android:paddingLeft="20dp" android:drawableLeft="@drawable/ic_trending_up_black_24dp" android:drawablePadding="10dp" android:layout_marginBottom="10dp" android:textSize="16sp"/> <View android:layout_width="fill_parent" android:layout_height="1dp" android:background="#efefef"/> <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> </LinearLayout> </android.support.v4.widget.NestedScrollView> 

Попробуйте использовать эту библиотеку – https://github.com/serso/android-linear-layout-manager .

LayoutManager библиотеки делает RecyclerView обертывает его содержимое. В этом случае RecyclerView будет «размером с внутренние виды», поэтому у него не будет полосы прокрутки, и пользователь будет использовать возможности прокрутки NestedScrollView. Поэтому он не будет двусмысленным, как «прокручиваемый внутри прокручиваемого».

Существует простой и тестовый код, который можно проверить

 <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent"/> </android.support.v4.widget.NestedScrollView> 

Вот код, который я использую, чтобы избежать прокрутки:

 mRecyclerView = (RecyclerView) view.findViewById(android.R.id.list); mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); mRecyclerView.getLayoutManager().setAutoMeasureEnabled(true); mRecyclerView.setNestedScrollingEnabled(false); mRecyclerView.setHasFixedSize(false); 

Я использовал RecyclerView внутри NestedScrollView, и он работал для меня. Единственное, что я должен был иметь в виду, это то, что NestedScrollView принимает только один дочерний вид. Так что в моем случае я использовал группу LienearLayout viewgroup, в которой находился мой RecyclerView, а также ряд других просмотров, которые мне нужны.

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

Позже я понял, что мой RecyclerView получает событие прокрутки и поэтому противоречит прокручиванию поведения NestedScrollView.

Поэтому для решения этой проблемы мне пришлось отключить функции прокрутки моего RecyclerView с помощью этого метода movieListNewRecyclerView.setNestedScrollingEnabled(false);

Вы можете проверить мою Instagram для короткого видео о том, что я на самом деле сделал. Это мой дескриптор instalk ofelix03

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

Если вы используете RecyclerView-23.2.1 или новее. Следующее решение будет работать очень хорошо:

В вашем макете добавьте RecyclerView следующим образом:

 <android.support.v7.widget.RecyclerView android:id="@+id/review_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="vertical" /> 

И в вашем java-файле:

 RecyclerView mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); LinearLayoutManager layoutManager=new LinearLayoutManager(getContext()); layoutManager.setAutoMeasureEnabled(true); mRecyclerView.setLayoutManager(layoutManager); mRecyclerView.setHasFixedSize(true); mRecyclerView.setAdapter(new YourListAdapter(getContext())); 

Здесь layoutManager.setAutoMeasureEnabled(true); Сделают трюк.

Ознакомьтесь с этой проблемой и этим блогом разработчиков для получения дополнительной информации.

Вы не можете использовать просмотр recycler внутри вложенного представления прокрутки. Он не предназначен для размещения других прокручиваемых представлений, но это связано с тем, что он является дочерним элементом самого прокручиваемого макета, в котором вам нужно вложенное прокручивание. У меня была одна и та же проблема, но в конце я переместил текстовое представление как headerview в recyclerview, сделал recyclerview прямым дочерним положением координатора и удалил вложенное представление прокрутки. Тогда все мои проблемы исчезли.

У меня есть Viewpager и RecyclerView внутри NestedScrollView. После добавления строк ниже

 recyclerView.setNestedScrollingEnabled(false); recyclerView.setHasFixedSize(false); 

Я решил проблему медленного прокрутки и прокрутки.

Мне пришлось реализовать CoordinatorLayout с прокруткой панели инструментов, и это просто заставило меня весь день возиться с этим. У меня есть работа, удалив NestedScrollView. Поэтому я просто использую RelativeLayout в корне.

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/rv_nearby" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </RelativeLayout> 

RecyclerView с NestedScrollView

  <android.support.v7.widget.RecyclerView android:id="@+id/rv" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" />