2

Dieses Ding macht mich verrückt.Anzeigen animiert mit CoordinatorLayout und AppBarLayout verrückt (manchmal)

ich waren in der Lage, dieses Verhalten zu bekommen (genau das, was ich will): http://i.imgur.com/PGhL22k.gif

Und das ist das Verhalten hat, ist, wenn ich sehr schnell nach unten scrollen: http://i.imgur.com/kk7icAc.gif und http://i.imgur.com/YNPNiA6.gif

Es tut mir leid, aber die GIFs sind größer als 2MB und ich kann sie hier nicht hochladen ...

Ich möchte die Paginierungsleiste am unteren Rand, um den gleichen Betrag der Symbolleiste zu verbergen. Wenn man langsam scrollt geht es sehr gut, aber beim schnellen Scrollen hat es ein merkwürdiges Verhalten, wie man an den oben genannten GIFs sehen kann.

Dies ist das Layout XML:

<?xml version="1.0" encoding="utf-8"?> 
    <android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:kiosk="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <include 
      layout="@layout/android_toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      kiosk:layout_scrollFlags="scroll|enterAlways"/> 
    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/vpPager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     kiosk:layout_behavior="@string/appbar_scrolling_view_behavior"/> 

    <include 
     layout="@layout/paginator_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom" 
     kiosk:layout_behavior="carl.fri.fer.views.KioskPaginator.KioskPaginatorScrollBehaviour"/> 
</android.support.design.widget.CoordinatorLayout> 

Die "android_toolbar" schließen sich wie folgt:

<?xml version="1.0" encoding="utf-8"?> 
<carl.fri.fer.views.KioskToolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/primaryColor" 
    android:minHeight="?attr/actionBarSize"/> 

und die "paginator_layout" ist die folgende:

<?xml version="1.0" encoding="utf-8"?> 
<carl.fri.fer.views.KioskPaginator.KioskPaginator 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/kpPaginator" 
    android:layout_width="match_parent" 
    android:layout_height="40dp" 
    android:layout_alignParentBottom="true" 
    android:animateLayoutChanges="true" 
    android:background="@color/primaryColor" 
    android:clickable="true" 
    android:orientation="horizontal"> 

    <TextView 
     android:id="@+id/tvCurrentPage" 
     android:layout_width="50dp" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" 
     android:gravity="center" 
     android:padding="10dp" 
     android:textColor="@color/color_pure_black" 
     android:textSize="17sp"/> 

    <LinearLayout 
     android:id="@+id/llMoreOptions" 
     android:layout_width="0dp" 
     android:layout_height="40dp" 
     android:layout_weight="1" 
     android:background="@android:color/transparent" 
     android:gravity="center_vertical" 
     android:orientation="horizontal"/> 

    <TextView 
     android:id="@+id/tvTotalPages" 
     android:layout_width="50dp" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" 
     android:gravity="center" 
     android:padding="10dp" 
     android:textColor="@color/color_pure_black" 
     android:textSize="17sp"/> 
</carl.fri.fer.views.KioskPaginator.KioskPaginator> 

Und das ScrollBehavior ist wie folgt:

public class KioskPaginatorScrollBehaviour extends AppBarLayout.ScrollingViewBehavior { 

    public KioskPaginatorScrollBehaviour(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { 
     return dependency instanceof AppBarLayout; 
    } 

    @Override 
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { 
     float depY = - dependency.getHeight(); 
     depY -= dependency.getY(); 

     Utils.log("dependency", "" + depY); 

     child.setTranslationY(depY); 

     return true; 
    } 
} 

Innerhalb jeder Seite des ViewPager befindet sich ein Fragment. Und der Inhalt dieses Fragments ist ein RecyclerView mit dynamischem Inhalt. Der gesamte Inhalt der RecyclerView wird aus der Datenbank geladen und Bilder werden zur Laufzeit geladen.

Kann mir bitte jemand sagen, warum passiert dieses seltsame Verhalten? Wie kann ich es reparieren? 1

Vielen Dank im Voraus ...

EDIT:

ich nur die Ursache für das seltsame Verhalten entdeckt! Der ViewPager lädt die aktuelle Seite und die angrenzenden Seiten. Der Inhalt des RecyclerView lädt aus dem Internet und sobald er geladen ist, geht es in den RecyclerView. Der ViewPager lädt zuerst die aktuelle Seite und dann die angrenzenden Seiten. Wenn ich die aktuelle Seite RecyclerView (Toolbar ist ausgeblendet) scrollte, wenn der 2. RecyclerView nur den Inhalt lädt und anzeigt, setzt er das aktuelle AppBarLayout-Verhalten zurück, so dass es mein benutzerdefiniertes Ansichtsverhalten zurücksetzt ... Wie kann ich das beheben? Ich möchte zu vermeiden, nicht angrenzende Ansichten Laden ..

EDIT 2:

Ok, geschieht es, wenn angrenzende Seiten von ViewPager Laden und auch wenn aus dem Internet Bilder im Inneren des RecyclerView geladen ... diese ist verrückt.

+0

Können Sie Projekt irgendwo veröffentlichen (z auf Github), um können wir leicht Problem zu reproduzieren? – Divers

+0

Es tut mir leid, aber das ist ein privates Projekt ... Ich denke, dass es fast alle Informationen gibt, die Sie brauchen. Ich werde jedoch versuchen, es in ein anderes Projekt zu übertragen, um zu versuchen, das Problem dort zu reproduzieren. –

+0

Erstellen Sie einfach ein Projekt, das das Problem reproduziert. Keine Notwendigkeit, Ihr wirkliches Projekt zu veröffentlichen. – Divers

Antwort

3

So endlich gelöst Ihr Problem - machen Sie Ihr eigenes Verhalten CoordinatorLayout.Behavior statt ScrollingViewBehavior erweitern und es wird wie erwartet funktionieren.Nur den Wert auf Ihre Ansicht des translationY, ist, dass gegenüber Y von AppBarLayout:

public class KioskPaginatorScrollBehaviour extends CoordinatorLayout.Behavior<View> { 

    public KioskPaginatorScrollBehaviour(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { 
     return dependency instanceof AppBarLayout; 
    } 

    @Override 
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { 
     float depY = -dependency.getY(); 
     child.setTranslationY(depY); 
     return true; 
    } 
} 
+0

Du bist mein HELD! Ich werde noch einige Tests machen und sobald ich sicher bin, dass dies die definitive Lösung ist, werde ich dich mit dem +200 Ruf belohnen;). Ich werde jetzt etwas über die Unterschiede zwischen 'AppBarLayout.ScrollingBehavior' und' CoordinatorLayout.Behaviour 'recherchieren, aber in der Zwischenzeit, weißt du es? Vielen Dank!!! –

+0

Nun, 'AppBarLayout.ScrollingViewBehavior' erweitert' CoordinatorLayout.Behavior' selbst und hat eine gewisse Logik für verschachteltes Scrollen. Wie in Leitfäden empfohlen, sollten Sie "CoordinatorLayout.Behavior" erweitern, wenn Sie Ihr benutzerdefiniertes Verhalten erstellen möchten :) – rom4ek

+0

Perfekt, vielen Dank. Ich hätte etwas Wichtiges übersehen müssen, als ich gelesen habe, wie man benutzerdefiniertes Verhalten erstellt ... –

Verwandte Themen