7

Ich verwende folgendes Layout in meinem Projekt.Es funktioniert gut, aber CollapsingToolbarLayout ist kollabiert, auch wenn RecyclerView leer ist oder RecyclerView hat nur sehr wenige Elemente. Das Verhalten, das ich möchte, ist, CollapsingToolbarLayout sollte nur zusammenklappen, wenn RecyclerView Elemente größer als sichtbare Elemente hat. Wie kann ich dieses Verhalten erreichen?CollapsingToolbarLayout sollte nicht zusammenklappen, wenn RecyclerView leer ist

<?xml version="1.0" encoding="utf-8"?> 
    <android.support.design.widget.CoordinatorLayout 
     android:id="@+id/coordinator_layout" 
     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="wrap_content" 
     android:fitsSystemWindows="true"> 

     <android.support.design.widget.AppBarLayout 
      android:id="@+id/app_bar" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:fitsSystemWindows="true" 
      android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

      <android.support.design.widget.CollapsingToolbarLayout 
       android:id="@+id/collapsing_toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:fitsSystemWindows="true" 
       app:contentScrim="?attr/colorPrimary" 
       app:layout_scrollFlags="scroll|exitUntilCollapsed"> 

       <include 
        layout="@layout/header" 
        android:fitsSystemWindows="true" 
        app:layout_collapseMode="parallax"/> 

       <android.support.v7.widget.Toolbar 
        android:id="@+id/toolbar" 
        android:layout_width="match_parent" 
        android:layout_height="?attr/actionBarSize" 
        app:layout_collapseMode="pin" 
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> 
      </android.support.design.widget.CollapsingToolbarLayout> 
     </android.support.design.widget.AppBarLayout> 

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

    </android.support.design.widget.CoordinatorLayout> 
+0

Hallo Vivart, Me zu gleiches Problem gegenüber. Wenn Sie ein Problem behoben haben, teilen Sie uns Ihre Idee mit. Dank –

+0

habe ich auch das selbe implementiert aber leider kollabiert mein kollabierender Barlayout nicht. je. schau auf meine Frage - http://stackoverflow.com/questions/33093066/collapsing-bar-layout-and-recyclerview –

Antwort

-2

Versuchen Sie collapsingBarLayout xml Wechsel zu:

<android.support.design.widget.CollapsingToolbarLayout 
        android:id="@+id/collapsing_toolbar" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:fitsSystemWindows="true" 
        app:contentScrim="?attr/colorPrimary" 
app:layout_scrollFlags="scroll|exitUntilCollapsed|enterAlways|enterAlwaysCollapsed"> 

Ich habe 2 zusätzliche Flags hinzugefügt: enterAlways und enterAlwaysCollapsed. Dies ist keine 100% funktionierende Lösung, aber ist besser als das Verhalten, das Sie derzeit haben.

0

Es ist ein bekannter Fehler. Aktualisieren Sie Ihre Support-Bibliotheken auf 22..2.1:

+3

Problem immer noch in Version 23.1.0. – Longi

+0

Jemand hat den Bug Link? – Eefret

+3

Habe noch diesen Fehler ... mit 23.1.1 – Blunderer

0

Wenn dies noch relevant ist, glaube ich, dass ich das gewünschte Verhalten erreicht habe.

Zu allererst/deaktivieren Scrollen zu aktivieren, müssen wir eine eigene LinearLayoutManager (dank this post) implementieren:

public class CustomLayoutManager extends LinearLayoutManager { 

    private boolean isScrollEnabled = true; 

    public CustomLayoutManager(Context context) { 
     super(context); 
    } 

    public void setScrollEnabled(boolean flag) { 
     this.isScrollEnabled = flag; 
    } 

    @Override 
    public boolean canScrollVertically() { 
     return isScrollEnabled && super.canScrollVertically(); 
    } 
} 

und stellen Sie sie auf RecyclerView:

layoutManager = new CustomLayoutManager(this); 
recyclerView.setLayoutManager(layoutManager); 

wir dann müssen erkennen, wann aktiviert und wann das Scrollen deaktiviert werden soll. Ich habe es mit einem AppBarLayout.OnOffsetChangedListener:

appBarLayout = mainView.findViewById(R.id.app_bar_layout); 
appBarLayout .addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { 
    @Override 
    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { 
     // verticalOffset == 0 means that the AppBarLayout is expanded 
     if (verticalOffset == 0) { 
      // here we check that the last item of the RecyclerView is visible 
      if (viewIsVisible(layoutManager.findViewByPosition(layoutManager.getItemCount() - 1))) { 
       layoutManager.setScrollEnabled(false); 
      } else { 
       layoutManager.setScrollEnabled(true); 
      } 
    } 
    } 
}); 

Und hier ist die Methode zu überprüfen, ob die Ansicht sichtbar ist:

private boolean viewIsVisible(View view) { 
    Rect scrollBounds = new Rect(); 
    list.getHitRect(scrollBounds); 
    return view != null && view.getLocalVisibleRect(scrollBounds); 
}