7

Ancora più problemi nell'utilizzo di CoordinatorLayout e AppBarLayout.CoordinatorLayout/AppBarLayout ExpandableListView in fase di rendering fuori schermo

Sto cercando di ottenere le funzionalità di base per far scorrere la barra degli strumenti sullo schermo quando si scorre verso il basso e si torna sullo schermo quando si scorre verso l'alto.

Tuttavia, il mio attuale set up sta mostrando un problema: non solo la barra degli strumenti non scorre, il ListView sembra essere fuori dallo schermo in basso. È quasi come se fosse stato compensato dall'altezza AppBarLayout.

Ecco una gif che descrive il problema, si noti che l'elemento finale è tagliato fuori anche la ScrollBar è fuori dallo schermo:

enter image description here

il mio layout è abbastanza standard:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 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="match_parent" 
               android:background="@color/background"> 

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

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?android:attr/actionBarSize" 
      android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
      android:background="@color/orange" 
      app:layout_scrollFlags="scroll|enterAlways"/> 

    </android.support.design.widget.AppBarLayout> 


    <android.support.v4.widget.SwipeRefreshLayout 
     android:id="@+id/swipeToRefresh" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

     <ExpandableListView 
      android:id="@+id/listView" 
      android:groupIndicator="@android:color/transparent" 
      android:layout_width="match_parent" 
      android:dividerHeight="0px" 
      android:layout_height="match_parent"/> 
    </android.support.v4.widget.SwipeRefreshLayout> 

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

Dai un'occhiata alla mia risposta a fatemi sapere se ha funzionato – waleedsarwar86

risposta

8

CoordinatorLayout funziona solo con RecyclerView o NestedScrollView.Try Wrapping di ExapandableListView in NestedScrollView o utilizzare il codice seguente per rendere NestedScrollingEnable per ExpandableListView.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    expandablelistView.setNestedScrollingEnabled(true); 
}else { 
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mSwipeLayout.getLayoutParams(); 
    params.bottomMargin = heightOfAppBarCompat; 
    mSwipeLayout.setLayoutParams(params); 
} 

Modifica È possibile far funzionare lo scorrimento come previsto pre-21 con l'istruzione else.

+0

Si dovrebbe dire meglio "RecyclerView -OR- NestedScrollView "... –

+1

@MartinPfeffer Grazie per la correzione – waleedsarwar86

+0

Sì, l'impostazione dello scorrimento nidificato abilitato su ExpandableListView lo corregge. Ho aggiunto un trucco alla tua risposta per i dispositivi pre v21, spero non ti dispiaccia. – Graeme

0

Vorrei scriverlo come un commento, ma in termini di leggibilità lascerò cadere queste informazioni come risposta. Se non funziona, fammelo sapere e lo eliminerò ... Immagino che dovresti dire alla tua barra degli strumenti come interagire. Nella mia app sulla barra degli strumenti si presenta così:

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

si prega di notare la "app: layout_collapseMode"

0
private int mPreviousVisibleItem; 


    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     expListView.setNestedScrollingEnabled(true); 
    } else { 
     expListView.setOnScrollListener(new AbsListView.OnScrollListener() { 

      @Override 
      public void onScrollStateChanged(AbsListView view, int scrollState) { 
      } 

      @Override 
      public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
       if (firstVisibleItem > mPreviousVisibleItem) { 
        appBarLayout.setExpanded(false, true); 
       } else if (firstVisibleItem < mPreviousVisibleItem) { 
        appBarLayout.setExpanded(true, true); 
       } 
       mPreviousVisibleItem = firstVisibleItem; 
      } 
     }); 
    } 
Problemi correlati