7

Noch mehr Problem bei der Verwendung von CoordinatorLayout und AppBarLayout.CoordinatorLayout/AppBarLayout ExpandableListView wird vom Bildschirm gerendert

Ich versuche, die grundlegende Funktionalität zu erreichen, die Symbolleiste aus dem Bildschirm scrollen zu lassen, wenn man nach unten scrollt und beim Scrollen auf den Bildschirm zurückkommt.

Meine aktuelle Konfiguration zeigt jedoch ein Problem: Nicht nur die Symbolleiste scrollt nicht ab, die ListView scheint unten auf dem Bildschirm zu rendern. Es ist fast so, als ob es durch die Höhe von AppBarLayout versetzt würde.

Hier ist ein gif das Problem beschreiben, beachten Sie, dass der letzte Punkt abgeschnitten wird auch die ScrollBar ist außerhalb des Bildschirms:

enter image description here

Mein Layout ist ziemlich 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

Werfen Sie einen Blick auf meine Antwort lassen Sie mich wissen, ob es – waleedsarwar86

Antwort

8

CoordinatorLayout funktioniert nur mit RecyclerView oder NestedScrollView.Try Wrapping Ihre ExapandableListView in NestedScrollView oder verwenden Sie den folgenden Code, um NestedScrollingEnable für ExpandableListView zu machen.

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

bearbeiten Sie Scrolling Arbeit machen können als Pre-21 mit der anderen Aussage erwartet.

+0

gearbeitet sollten Sie besser sagen „RecyclerView -OR- NestedScrollView "... –

+1

@MartinPfeffer Danke für die Korrektur – waleedsarwar86

+0

Yup, die Einstellung verschachtelt Scrollen aktiviert auf der ExpandableListView behebt es. Ich habe einen Hack zu Ihrer Antwort für Pre-V21-Geräte hinzugefügt, hoffe, es macht Ihnen nichts aus. – Graeme

0

Ich würde es als Kommentar schreiben, aber in Bezug auf Lesbarkeit werde ich diese Informationen als Antwort fallen lassen. Wenn es nicht funktioniert, lassen Sie es mich wissen und ich werde es löschen ... Ich denke, Sie sollten Ihre Toolbar mitteilen, wie sie interagieren. In meiner app sieht die Symbolleiste wie folgt aus:

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

beachten Sie bitte die „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; 
      } 
     }); 
    } 
Verwandte Themen