2016-09-09 39 views
12

CollapsingToolbarLayout działa tylko z RecyclerView, ale nie działa z ListView i GridView.Problem zwijaniaToolbarLayout z GridView

Poniżej jeden jest mój plik XML:

<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:fitsSystemWindows="true"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="192dp" 
     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:expandedTitleMarginBottom="32dp" 
      app:expandedTitleMarginEnd="64dp" 
      app:expandedTitleMarginStart="48dp" 
      app:layout_scrollFlags="scroll|exitUntilCollapsed"> 

      <ImageView 
       android:id="@+id/restaurant_image" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:src="@drawable/gradiant" 
       app:layout_collapseMode="parallax" /> 

      <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" /> 
     </android.support.design.widget.CollapsingToolbarLayout> 
    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.widget.NestedScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:animateLayoutChanges="true" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     android:fillViewport="true"> 


    <GridView 
     android:id="@+id/restaurant_items" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginLeft="20dp" 
     android:layout_marginRight="20dp" 
     android:layout_marginTop="5dp" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     android:gravity="center" 
     android:numColumns="2" 
     android:verticalSpacing="20dp" /> 

    </android.support.v4.widget.NestedScrollView> 

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

i ten jest moim Activity file:

 Toolbar toolbar = (Toolbar) findViewById(R.id.anim_toolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     CollapsingToolbarLayout collapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar); 
     collapsingToolbar.setTitle("Resturant Name"); 
     ImageView header = (ImageView) findViewById(R.id.restaurant_image); 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      ViewCompat.setNestedScrollingEnabled(mGrid,true); 
     } 

     mGrid.setAdapter(new ResturantItemsAdapter(this, images, name));//images and name is array with size 10.... 

Uwaga: -Scrolling pracuje bez zarzutu, ale po niektóre listy GridView przewijania jest zatrzymany i nie przewija więcej, nawet jeśli jest więcej wierszy w gridView. Przewijanie tylko dla 8 elementu gridView i 9 i 10 pozycji nie jest wyświetlane ...

Przeszukałem wiele linków, mówiących, że działają tylko w wersji Lollipop. Poniżej wersja ma pewien problem.

Czy można uruchomić funkcję Collapse Tollabr poniżej wersji Lollipop?

Niż do wszystkich ....

+3

Można użyć 'RecyclerView' z' GridLayoutManager' zamiast 'GridView'. –

+0

Usuń 'android: fillViewport =" true "' z NestedScrollView i ustaw dynamiczną wysokość twojego ListView lub GridView –

+0

@HamedNabizadeh, po rozwiązaniu zniknął mój cały przedmiot za paskiem narzędzi Zwiń, a przewijanie nie działa ... – sushildlh

Odpowiedz

5

CoordinatorLayout działa lepiej z RecyclerView lub NestedScrollView. Dla Twojego wymagania możesz użyć RecyclerView z GridLayoutManger.

<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:fitsSystemWindows="true"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="192dp" 
     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:expandedTitleMarginBottom="32dp" 
      app:expandedTitleMarginEnd="64dp" 
      app:expandedTitleMarginStart="48dp" 
      app:layout_scrollFlags="scroll|exitUntilCollapsed"> 

      <ImageView 
       android:id="@+id/restaurant_image" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:src="@drawable/gradiant" 
       app:layout_collapseMode="parallax" /> 

      <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" /> 
     </android.support.design.widget.CollapsingToolbarLayout> 
    </android.support.design.widget.AppBarLayout> 

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

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

RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(this, 2); recyclerView.setLayoutManager(mLayoutManager);

Oto przykład, który demonstruje wykorzystanie GridLayoutManger: http://www.androidhive.info/2016/05/android-working-with-card-view-and-recycler-view/

+0

thanx za wskazówkę, która pomoże mi rozwiązać ten problem. – sushildlh

+0

Moja przyjemność ;-) –

5

Trzeba owinąć GridView i ListView w NestedScrollView i dodać odpowiednią zachowanie, tak:

<android.support.v4.widget.NestedScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:animateLayoutChanges="true" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    android:fillViewport="true"> 
1

ListView i GridView nie działają bezpośrednio z CoordinatorLayout i CollapsibleToolbar.

Spróbuj użyć widoku NestedScrollView lub RecyclerView za pomocą GridLayoutManager, aby utworzyć GridView.

0

Raz spotkałem się z tym samym problemem, gdy chciałem użyć CollapsingToolbarLayout z ListView/GridView.

Działają one tylko z programem RecyclerView. Dlatego zaleciłbym wdrożenie RecyclerView zamiast GridView.

(Niezalecane) - Ale jeśli nadal chcesz kontynuować z GridView, oto jedna sztuczka (jugaad), aby rozwiązać problem.

Przewijanie działa poprawnie, ale po niektóre listy GridView przewijania jest zatrzymany i nie przewijania więcej, nawet nie ma więcej wierszy w widoku GridView .it przewijanie tylko dla 8 pozycji GridView i 9. i 10. pozycji nie pokazuje ..

Tutaj twój GridView jest przesuwany poniżej ekranu zgodnie z wysokością AppBarLayout czyli 192dp. Więc możesz dodać ten sam paddingBottom = 192dp do swojego GridView, aby go wyciągnąć i uczynić drugi ostatni 2 element widoczny. Plus nie zapomnij dodać clipToPadding = false.

<GridView 
     android:id="@+id/restaurant_items" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginLeft="20dp" 
     android:layout_marginRight="20dp" 
     android:layout_marginTop="5dp" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     android:gravity="center" 
     android:numColumns="2" 
     android:verticalSpacing="20dp" 
     android:paddingBottom = "192dp" 
     android:clipToPadding = "false" /> 
+0

używa tego ostatniego ** 4 elementu ** brakuje ...... – sushildlh

+0

Przepraszam, mój błąd ... clipToPadding powinien być fałszywy. Odpowiedź zaktualizowana. – iMDroid

0

CoordinateLayout pracuje ListView i GridView tylko wtedy, gdy API > 21.

dla ListView można kodować w ten sposób.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    listView.setNestedScrollingEnabled(true); 
} 

Więc aktualizowane CoordinateLayout działa tylko z NestedScrollView i RecycleView.

Więc jak @amitairos powiedzieć, że trzeba umieścić ListView lub GridView do NestScrollView z nim pracować.