7

Sto usando il seguente layout nel mio progetto. Funziona bene ma CollapsingToolbarLayout sta collassando anche quando RecyclerView è vuoto o RecyclerView ha pochissimi elementi. Comportamento che voglio è, CollapsingToolbarLayout dovrebbe comprimere solo quando RecyclerView ha elementi superiori a quelli visibili. Come posso ottenere questo comportamento?CollapsingToolbarLayout non dovrebbe comprimere quando RecyclerView è vuoto

<?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

Hi Vivart, Me ad affrontare lo stesso problema. Se hai risolto il problema, ti preghiamo di condividere la tua idea. Grazie –

+0

ho anche implementato lo stesso, ma sfortunatamente il mio barlayout non sta crollando. mai. guarda la mia domanda - http://stackoverflow.com/questions/33093066/collapsing-bar-layout-and-recyclerview –

risposta

-2

provare a modificare le xml collapsingBarLayout a:

<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"> 

ho aggiunto 2 flag addizionali: enterAlways e enterAlwaysCollapsed. Questa non è una soluzione funzionante al 100%, ma è meglio del comportamento che hai attualmente.

0

È un bug noto. Aggiorna le tue librerie di supporto a 22..2.1:

com.android.support:design:22.2.1 
+3

Problema ancora presente nella versione 23.1.0. – Longi

+0

Qualcuno ha il link del bug? – Eefret

+3

Ancora questo bug ... con 23.1.1 – Blunderer

0

Se questo è ancora pertinente, penso di essere riuscito a ottenere il comportamento desiderato.

Prima di tutto, per consentire lo scorrimento/disabilitare, dobbiamo implementare un custom LinearLayoutManager (grazie a this post):

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

e impostarlo al RecyclerView:

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

Poi siamo bisogno di rilevare, quando abilitare e quando disabilitare lo scorrimento. L'ho fatto con un 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); 
      } 
    } 
    } 
}); 

E qui è il metodo per controllare se la vista è visibile:

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