7

Jeszcze większy problem z używaniem CoordinatorLayout i AppBarLayout.CoordinatorLayout/AppBarLayout ExpandableListWyjście renderowane poza ekranem

Próbuję uzyskać podstawową funkcję przewijania ekranu w pasku narzędzi po przewinięciu w dół i powrocie na ekran podczas przewijania w górę.

Jednak moja obecna konfiguracja pokazuje problem: nie tylko pasek narzędzi nie przewija się, ale ListView wydaje się renderować poza ekranem na dole. To prawie tak, jakby została skompensowana przez wysokość AppBarLayout.

Oto gif opisując problem, trzeba pamiętać, że ostateczna pozycja jest odcięta również pasek przewijania jest wyłączony ekran:

enter image description here

Mój układ jest dość standardowy:

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

Wystarczy popatrzeć na moją odpowiedź na dać mi znać, jeśli to działało – waleedsarwar86

Odpowiedz

8

CoordinatorLayout działa tylko z RecyclerView lub NestedScrollView.Try Owijanie ExapandableListView wewnątrz NestedScrollView lub użyj poniższego kodu, aby NestedScrollingEnable dla 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); 
} 

Edit Można zrobić pracę przewijania zgodnie z oczekiwaniami sprzed 21 z rachunku innego.

+0

Powinieneś lepiej powiedzieć „RecyclerView -LUB- NestedScrollView "... –

+1

@MartinPfeffer Dzięki za poprawkę – waleedsarwar86

+0

Tak, ustawienie scrollingu włączonego w ExpandableListView naprawia to. Dodałem hack do twojej odpowiedzi na urządzenia pre v21, mam nadzieję, że nie masz nic przeciwko. – Graeme

0

Napisałbym to jako komentarz, ale pod względem czytelności odrzucę tę informację jako odpowiedź. Jeśli to nie zadziała, daj mi znać, a ja go usunę ... Domyślam się, że powinieneś poinformować swój pasek narzędziowy, jak współpracować. W mojej aplikacji pasek narzędzi wygląda tak:

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

pamiętać „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; 
      } 
     }); 
    }