2016-09-09 1 views
12

CollapsingToolbarLayout работает только с RecyclerView, но не работает с ListView и GridView.CollapsingToolbarLayout Issue with GridView

Ниже один мой 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> 

и это один мой Activity файл:

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

Примечание: -Scrolling работает нормально, но после того, как некоторые из списка GridView прокрутке он застрял и не прокручивается больше, даже больше в gridView. Прокрутка только для 8-го элемента gridView и 9-го и 10-го элементов не отображается ...

Я искал многие ссылки там, люди говорят, что это работает только выше и в версии Lollipop. Ниже приведены некоторые проблемы.

Можно ли запустить Свернуть работу Tollabr ниже версии lollipop?

Thanx всем ....

+3

Вы можете использовать '' RecyclerView' с GridLayoutManager' вместо 'GridView'. –

+0

Удалите 'android: fillViewport =" true "' из NestedScrollView и установите динамическую высоту в ListView или GridView. –

+0

@HamedNabizadeh, решение исчезло из моего элемента за панелью Свернуть и прокрутка не работает ... – sushildlh

ответ

5

CoordinatorLayout работает лучше с RecyclerView или NestedScrollView. Для вашего требования вы можете использовать RecyclerView с 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);

Вот пример, который демонстрирует использование GridLayoutManger: http://www.androidhive.info/2016/05/android-working-with-card-view-and-recycler-view/

+0

спасибо за подсказку, которая поможет мне решить эту проблему. – sushildlh

+0

Мое удовольствие ;-) –

5

Вам нужно обернуть GridView и ListView в NestedScrollView и добавить правильное поведение, как это:

<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 и GridView не работает непосредственно с CoordinatorLayout и CollapsibleToolbar.

Попробуйте использовать NestedScrollView или RecyclerView с GridLayoutManager для создания GridView.

0

Я столкнулся с той же проблемой, когда захотел использовать CollapsingToolbarLayout с ListView/GridView.

Они работают только с RecyclerView. Поэтому я рекомендую вам реализовать RecyclerView вместо GridView.

(Не рекомендуется) - Но если вы все еще хотите продолжить работу с GridView, вот один трюк (jugaad), чтобы решить вашу проблему.

Скроллинг работает нормально, но после того, как некоторые из списка GridView прокручивают его, застряли и не прокручивают больше, даже больше в gridView. Прокрутка только для 8-го элемента gridView и 9-го и 10-го элементов не отображается.

Здесь ваш GridView сдвинут под экраном в соответствии с высотой AppBarLayout, которая равна 192dp. Таким образом, вы можете добавить тот же paddingBottom = 192dp к вашему GridView, чтобы подтянуть его и сделать второй последний видимый предмет. Плюс не забудьте добавить 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

использовать это мой последний ** 4 пункт ** отсутствует ...... – sushildlh

+0

Извините, моя ошибка .. clipToPadding должно быть ложным. Ответ обновлен. – iMDroid

0

CoordinateLayout работает ListView и GridView только если ваш API > 21.

для ListView Вы можете написать код следующим образом.

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

Так в обновленном CoordinateLayout работать только с NestedScrollView и RecycleView.

Итак, как @amitairos говорят, что вы должны поставить ListView или GridView к NestScrollView работать с ним.