it-swarm.com.de

Recyclerview in ScrollView wird nicht reibungslos durchlaufen

Für meine App verwende ich ein RecyclerView innerhalb eines ScrollView, wobei das RecyclerView eine Höhe hat, die auf seinem Inhalt basiert, indem diese Bibliothek verwendet wird. Das Scrollen funktioniert, aber es funktioniert nicht reibungslos, wenn ich über das RecyclerView scrolle. Wenn ich über ScrollView selbst scrolle, läuft das Bild reibungslos.

Der Code, den ich verwende, um RecyclerView zu definieren:

LinearLayoutManager friendsLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext(), Android.support.v7.widget.LinearLayoutManager.VERTICAL, false);
mFriendsListView.setLayoutManager(friendsLayoutManager);
mFriendsListView.addItemDecoration(new DividerItemDecoration(getActivity().getApplicationContext(), null));

Die RecyclerView in der ScrollView:

<Android.support.v7.widget.RecyclerView
    Android:layout_marginTop="10dp"
    Android:layout_marginBottom="10dp"
    Android:id="@+id/friendsList"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content" />
142
Bart Bergmans

Versuchen Sie es zu tun:

RecyclerView v = (RecyclerView) findViewById(...);
v.setNestedScrollingEnabled(false);

Alternativ können Sie Ihr Layout mithilfe der Support Design Library ändern. Ich schätze, Ihr aktuelles Layout sieht so aus:

<ScrollView >
   <LinearLayout >

       <View > <!-- upper content -->
       <RecyclerView > <!-- with custom layoutmanager -->

   </LinearLayout >
</ScrollView >

Sie können das ändern zu:

<CoordinatorLayout >

    <AppBarLayout >
        <CollapsingToolbarLayout >
             <!-- with your content, and layout_scrollFlags="scroll" -->
        </CollapsingToolbarLayout >
    </AppBarLayout >

    <RecyclerView > <!-- with standard layoutManager -->

</CoordinatorLayout >

Dies ist jedoch ein längerer Weg, und wenn Sie mit dem benutzerdefinierten linearen Layout-Manager zufrieden sind, deaktivieren Sie einfach den verschachtelten Bildlauf in der Recycling-Ansicht.

Bearbeiten (03.04.2016)

Die v 23.2-Version der Unterstützungsbibliotheken enthält jetzt in allen Standardvarianten LayoutManagers eine werkseitige "Wrap-Content" -Funktion. Ich habe es nicht getestet, aber Sie sollten es wahrscheinlich der Bibliothek vorziehen, die Sie verwendet haben.

<ScrollView >
   <LinearLayout >

       <View > <!-- upper content -->
       <RecyclerView > <!-- with wrap_content -->

   </LinearLayout >
</ScrollView >
330
natario

Ich musste nur das verwenden:

mMyRecyclerView.setNestedScrollingEnabled(false);

in meiner onCreateView()-Methode.

Danke vielmals!

69
Victor Augusto

Sie können diesen Weg entweder verwenden: 

Fügen Sie diese Zeile zu Ihrer XML recyclerView hinzu:

Android:nestedScrollingEnabled="false"

oder in Java-Code:

RecyclerView.setNestedScrollingEnabled(false);

hoffe das hat geholfen.

25
tahaDev

Sie können beide Möglichkeiten mit XML und programmgesteuert ausprobieren. Das Problem, mit dem Sie möglicherweise konfrontiert sind (unter API 21), wird jedoch nicht funktionieren, wenn Sie es mit XML ausführen. Daher ist es besser, es programmatisch in Ihrer Aktivität/Ihrem Fragment festzulegen.

XML-Code:

<Android.support.v7.widget.RecyclerView
      Android:id="@+id/recycleView"
      Android:layout_width="match_parent"
      Android:visibility="gone"
      Android:nestedScrollingEnabled="false"
      Android:layout_height="wrap_content"
      Android:layout_below="@+id/linearLayoutBottomText" /> 

Programmatisch:

 recycleView = (RecyclerView) findViewById(R.id.recycleView);
 recycleView.setNestedScrollingEnabled(false);
8
Pramod Baggolli

Ich hatte ähnliche Probleme (ich habe versucht, ein verschachteltes RecyclerViews zu erstellen, etwa das Google PlayStore-Design). Der beste Weg, um damit umzugehen, ist die Unterklasse der untergeordneten RecyclerViews und die Überschreibung der Methoden 'onInterceptTouchEvent' und 'onTouchEvent'. Auf diese Weise haben Sie die vollständige Kontrolle über das Verhalten dieser Ereignisse und können schließlich scrollen.

2
mahabudhi

Zusammenfassung aller Antworten (Vor- und Nachteile)

Für einzelne Recyclingübersicht

sie können es im Coordinator-Layout verwenden.

Vorteil - Es werden nicht ganze Recycling-Artikel geladen. Also reibungslose Verladung.

Nachteil - Sie können nicht zwei Recyclings im Coordinator-Layout laden - es treten Bildlaufprobleme auf

referenz - https://stackoverflow.com/a/33143512/3879847

Für Mehrfachübersicht mit minimalen Zeilen

sie können in NestedScrollView laden

Vorteil - es wird reibungslos gescrollt

Nachteil - Es werden alle Zeilen der Recyclingübersicht geladen, sodass Ihre Aktivität mit Verzögerung geöffnet wird

referenz - https://stackoverflow.com/a/33143512/3879847

Für Mehrfachübersicht mit großen Zeilen (mehr als 100)

Sie müssen mit recyclerview gehen.

Vorteil - Bildlauf reibungslos, reibungslos laden

Nachteil - Sie müssen mehr Code und Logik schreiben

Laden Sie jede Recylerview mit Hilfe von Multi-Viewholdern in die Haupt-Recyclerview

ex:

MainRecyclerview

-ChildRecyclerview1 (ViewHolder1)

-ChildRecyclerview2 (ViewHolder2)

-ChildRecyclerview3 (ViewHolder3) 

-Any other layout   (ViewHolder4)

Referenz für multi-viewHolder - https://stackoverflow.com/a/26245463/3879847

0
Ranjith Kumar

Oder Sie können einfach Android:focusableInTouchMode="true" in Ihrer Recycler-Ansicht einstellen

0
Sandeep Devrari
<?xml version="1.0" encoding="utf-8"?>
<Android.support.constraint.ConstraintLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <Android.support.v4.widget.NestedScrollView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent">

        <Android.support.constraint.ConstraintLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent">

            <Android.support.constraint.ConstraintLayout
                Android:id="@+id/constraintlayout_main"
                Android:layout_width="match_parent"
                Android:layout_height="@dimen/layout_width_height_fortyfive"
                Android:layout_marginLeft="@dimen/padding_margin_sixteen"
                Android:layout_marginRight="@dimen/padding_margin_sixteen"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent">

                <TextView
                    Android:id="@+id/textview_settings"
                    style="@style/textviewHeaderMain"
                    Android:gravity="start"
                    Android:text="@string/app_name"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintRight_toRightOf="parent" />

            </Android.support.constraint.ConstraintLayout>

            <Android.support.constraint.ConstraintLayout
                Android:id="@+id/constraintlayout_recyclerview"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_marginStart="@dimen/padding_margin_zero"
                Android:layout_marginTop="@dimen/padding_margin_zero"
                Android:layout_marginEnd="@dimen/padding_margin_zero"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/constraintlayout_main">

                <Android.support.v7.widget.RecyclerView
                    Android:id="@+id/recyclerview_list"
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content"
                    Android:nestedScrollingEnabled="false"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintRight_toRightOf="parent" />

            </Android.support.constraint.ConstraintLayout>

        </Android.support.constraint.ConstraintLayout>

    </Android.support.v4.widget.NestedScrollView>

</Android.support.constraint.ConstraintLayout>

Dieser Code funktioniert in ConstraintLayout Android

0
Hits sapra

Die Verwendung der verschachtelten Bildlaufansicht anstelle der Bildlaufansicht hat mein Problem behoben

<LinearLayout> <!--Main Layout -->
   <Android.support.v4.widget.NestedScrollView>
     <LinearLayout > <!--Nested Scoll View enclosing Layout -->`

       <View > <!-- upper content --> 
       <RecyclerView >


     </LinearLayout > 
   </Android.support.v4.widget.NestedScrollView>
</LinearLayout>
0
Siddy Hacks

Wenn Sie in Ihren Kinderansichten VideoView- oder Widgets mit hohem Gewicht verwenden, behalten Sie Ihre RecyclerView-Datei mit der Höhe wrap_content Innerhalb einer NestedScrollView-Datei mit der Höhe match_parent Dann funktioniert Scrollen so perfekt, wie Sie es möchten.

Zu Ihrer Information,

    <Android.support.v4.widget.NestedScrollView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">

        <Android.support.v7.widget.RecyclerView
            Android:layout_width="match_parent"
            Android:nestedScrollingEnabled="false"
            Android:layout_height="wrap_content"
            Android:clipToPadding="false" />

    </Android.support.v4.widget.NestedScrollView>

Dank Micro war dies aus deinem Hinweis

karthik

0

XML-Code:

<Android.support.v4.widget.NestedScrollView
            Android:layout_width="match_parent"
            Android:layout_height="match_parent">

            <Android.support.v7.widget.RecyclerView
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:clipToPadding="false" />

        </Android.support.v4.widget.NestedScrollView>

in Java-Code:

  recycleView = (RecyclerView) findViewById(R.id.recycleView);
     recycleView.setNestedScrollingEnabled(false);
0
Mohsinali