Wie verwende ich RecyclerView in NestedScrollView?

Wie verwende NestedScrollView RecyclerView in NestedScrollView ? RecyclerView Inhalt ist nach dem Einstellen des Adapters nicht sichtbar.

AKTUALISIERUNGS- Layout-Code aktualisiert.

         

Ersetzen Sie Ihre RecyclerView mit,

  

Hier,

 app:layout_behavior="@string/appbar_scrolling_view_behavior" 

wird den Rest der Dinge verwalten.

Eine weitere Sache, keine Notwendigkeit, Ihre RecyclerView in NestedScrollView zu setzen

AKTUALISIEREN

Seit der Android Support Library 23.2.0 wurde die Methode setAutoMeasureEnabled(true) für LayoutManager hinzugefügt. Es macht RecyclerView seinen Inhalt zu umhüllen und funktioniert wie ein Zauber.
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html

Fügen Sie einfach etwas hinzu:

  LayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setAutoMeasureEnabled(true); recyclerView.setLayoutManager(layoutManager); recyclerView.setNestedScrollingEnabled(false); 

Alte Antwort (nicht empfohlen)

Sie können RecyclerView in NestedScrollView . Zunächst sollten Sie Ihren eigenen LinearLayoutManager , damit Ihr RecyclerView seinen Inhalt LinearLayoutManager . Beispielsweise:

 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); } } 

Verwenden Sie anschließend diesen LayoutManager für Ihre RecyclerView

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

Aber Sie sollten diese beiden Methoden auch aufrufen:

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

Hier setNestedScrollingEnabled(false) Scrollen für RecyclerView , sodass das Scrolling-Ereignis von NestedScrollView nicht abgefangen NestedScrollView . Und setHasFixedSize(false) bestimmt, dass Änderungen im setHasFixedSize(false) die Größe von RecyclerView ändern können

Wichtiger Hinweis: Diese Lösung ist in einigen Fällen etwas errorshaft und hat Probleme mit der performance. Wenn Sie also viele Elemente in Ihrem RecyclerView würde ich empfehlen, eine benutzerdefinierte LinearLayout basierte Implementierung der LinearLayout zu verwenden, analoges für Adapter zu erstellen und Machen Sie es sich wie ListView oder RecyclerView verhalten

1) Sie müssen die Support-Bibliothek 23.2.0 (oder) oben verwenden

2) und RecyclerView height wird wrap_content .

3) recyclerView.setNestedScrollingEnabled(false)

Aber damit funktioniert das Recycler-Muster nicht. (dh alle Ansichten werden gleichzeitig geladen, da wrap_content die Höhe des vollständigen RecyclerView so dass alle wrap_content Ansichten auf einmal wrap_content werden. Keine Ansicht wird wiederverwendet). Versuchen Sie, dieses Muster nicht zu verwenden, es sei denn, es ist wirklich erforderlich. Versuchen Sie, viewType zu verwenden und fügen Sie alle anderen Ansichten hinzu, die zu RecyclerView blättern müssen, anstatt RecyclerView in Scrollview . Der performanceseinfluss wird sehr hoch sein.

Um es einfach zu machen “es LinearLayout nur als LinearLayout mit allen LinearLayout Ansichten”

Sie können android:fillViewport="true" , damit NestedScrollView den RecyclerView misst. Der RecyclerView füllt die verbleibende Höhe. Wenn Sie also in NestScrollView blättern NestScrollView , können Sie die NestScrollView des RecyclerView minHeight .

Einfach recyclerView.setNestedScrollingEnabled(false); hinzufügen recyclerView.setNestedScrollingEnabled(false); vor setAdapter selbst arbeitete für mich. Ich habe nirgends die app:layout_behavior="@string/appbar_scrolling_view_behavior" und keinen benutzerdefinierten Layout-Manager festgelegt

             

Das funktioniert für mich

    

Versuchen Sie, diese Bibliothek zu verwenden – https://github.com/serso/android-linear-layout-manager .

LayoutManager der Bibliothek lässt RecyclerView seinen Inhalt umbrechen. In diesem Fall ist RecyclerView “so groß wie innere Ansichten”, so dass es keine Bildlaufleisten und Benutzer Scrollfähigkeiten von NestedScrollView verwenden wird. Daher wird es nicht mehrdeutig sein wie “scrollbar innerhalb scrollbar”.

Es gibt einen einfachen und prüfenden Code, den Sie überprüfen können

    

Hier ist der Code, den ich verwende, um Scrollprobleme zu vermeiden:

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

Ich benutzte RecyclerView in einem NestedScrollView und es funktionierte für mich. Der einzige Fehler, den ich im Auge behalten musste, war, dass eine NestedScrollView nur eine untergeordnete Ansicht benötigt. Also in meinem Fall habe ich von LienearLayout viewgroup verwendet, die mein RecyclerView plus eine Anzahl anderer Ansichten beherbergte, die ich brauchte.

Ich erhalte ein Problem, indem ich meine RecyclerView in die NestedScrollView stelle. Ich merkte, dass der Inhalt meines RecyclerViews nachlässig scrollte.

Später stellte ich fest, dass mein RecyclerView das scrollende Ereignis erhielt und daher mit dem Scroll-Verhalten von NestedScrollView in Konflikt stand.

movieListNewRecyclerView.setNestedScrollingEnabled(false); dieses Problem zu lösen, musste ich die Scroll-functionalität meines RecyclerView mit dieser Methode movieListNewRecyclerView.setNestedScrollingEnabled(false);

Sie können mein Instagram für ein kurzes Video von dem, was ich tat, auschecken. Dies ist mein Instagram-Handle von elix03

Klicken Sie auf dieses Bild, um zu sehen, was ich gemacht habe

Wenn Sie RecyclerView-23.2.1 oder höher verwenden. Folgende Lösung wird gut funktionieren:

Fügen Sie in Ihrem Layout RecyclerView wie folgt hinzu:

  

Und in deiner Java-Datei:

 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())); 

Hier layoutManager.setAutoMeasureEnabled(true); wird den Trick machen.

Weitere Informationen finden Sie in dieser Ausgabe und in diesem Entwicklerblog .

Ich habe Viewpager und RecyclerView in der NestedScrollView. Nach dem Hinzufügen von Zeilen

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

Ich habe das langsame Scroll- und Scroll-Lag Problem getriggers.

Sie können eine Recycleransicht nicht in einer geschachtelten Bildlaufansicht verwenden. Es ist nicht beabsichtigt, weitere scrollbare Ansichten zu enthalten, aber weil es sich um ein untergeordnetes Scroll-Layout handelt, benötigen Sie die verschachtelte Scroll-Ansicht. Ich hatte das gleiche Problem, aber am Ende habe ich meine Textansicht in der Recycleransicht als Headerview verschoben, die Recycleransicht zu einem direkten Kind des Koordinatorlayouts gemacht und die verschachtelte Bildlaufansicht gelöscht. Dann waren alle meine Probleme weg.

Ich musste CoordinatorLayout mit Scrolling der Toolbar implementieren und es dauerte nur den ganzen Tag, dass ich damit herumhantierte. Ich habe es funktioniert, indem ich NestedScrollView überhaupt entferne. Also verwende ich nur RelativeLayout im Wurzelverzeichnis.

 < ?xml version="1.0" encoding="utf-8"?>    

RecyclerView mit NestedScrollView