web-dev-qa-db-fra.com

Librairie de conception - CoordinatorLayout/CollapsingToolbarLayout avec GridView/listView

C'est peut-être une question idiote mais je n'ai pas bien compris Design lib. Je suis cette référence pour créer la disposition ci-dessous. La zone bleue doit fonctionner comme parallaxe lorsque je fais défiler la GridView. Mais lorsque je fais défiler la vue, rien ne se passe dans AppBarLayout. 

Mais cela fonctionne avec NestedScrollView et RecyclerView

Layout

Ci-dessous est mon fichier de mise en page-

<?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:id="@+id/main_content"
    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:background="#500403"
    Android:layout_height="@dimen/detail_backdrop_height"
    Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    Android:fitsSystemWindows="true">

    <Android.support.design.widget.CollapsingToolbarLayout
        Android:id="@+id/collapsing_toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:background="#122453"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        Android:fitsSystemWindows="true"
        app:contentScrim="?attr/colorPrimary"
        app:expandedTitleMarginStart="48dp"
        app:expandedTitleMarginEnd="64dp">


        <ImageView
            Android:id="@+id/backdrop"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:scaleType="centerCrop"
            Android:fitsSystemWindows="true"
            app:layout_collapseMode="parallax" />
        <ImageView
            Android:id="@+id/backdrop1"
            Android:layout_width="50dp"
            Android:layout_height="50dp"
            Android:scaleType="fitCenter"
            Android:fitsSystemWindows="true"
            Android:layout_gravity="center"
            Android:src="@drawable/bar_offline"
            app:layout_collapseMode="parallax" />


        <Android.support.v7.widget.Toolbar
            Android:id="@+id/toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="?attr/actionBarSize"
            Android:background="#982223"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:layout_collapseMode="pin" />
    </Android.support.design.widget.CollapsingToolbarLayout>
</Android.support.design.widget.AppBarLayout>

  <GridView
      Android:id="@+id/grid"
      Android:numColumns="4"
      Android:background="#367723"
      Android:layout_width="match_parent"
      Android:layout_height="match_parent"
      app:layout_behavior="@string/appbar_scrolling_view_behavior"
      />
<Android.support.design.widget.FloatingActionButton
    Android:layout_height="wrap_content"
    Android:layout_width="wrap_content"
    app:layout_anchor="@id/appbar"
    app:layout_anchorGravity="bottom|right|end"
    Android:src="@drawable/bar_offline"
    Android:layout_margin="@dimen/fab_margin"
    Android:clickable="true"/>
</Android.support.design.widget.CoordinatorLayout>

Toute aide serait appréciée.

27
Tarun Varshney

Avec ListView/GridView, cela ne fonctionne que sur Lollipop en suivant le code-

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

Je pense que pour Now CoordinatorLayout ne fonctionne qu'avec RecyclerView et NestedScrollView

MODIFIER :

utilisation -

ViewCompat.setNestedScrollingEnabled(listView/gridview,true); (add Android Support v4 Library 23.1 or +)
37
Tarun Varshney

Une solution simple a été ajoutée au support lib:

ViewCompat.setNestedScrollingEnabled(listView,true);

Je l'ai testé avec Android Support v4 Library 23.1 et cela fonctionne bien.

13
daemmie

Actuellement, la ListView et la GridView ont le comportement attendu avec la CoordinatorLayout uniquement avec l'API> 21.

Pour obtenir ce comportement, vous devez définir:

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

Il ne suffit pas d'implémenter la NestedScrollingChild. La AbsListView n'est pas déployée avec les bibliothèques de support, elle dépend du SO exécuté sur le périphérique.

Vous devez remplacer certaines méthodes dans AbsListView. Par exemple, vous pouvez vérifier la méthode onInterceptTouchEvent.

Dans ce code, vous pouvez voir:

  case MotionEvent.ACTION_DOWN: {
    //......
    startNestedScroll(SCROLL_AXIS_VERTICAL);
    //....
  }

  case MotionEvent.ACTION_MOVE: {
    //.....
     if (startScrollIfNeeded((int) ev.getX(pointerIndex), y, null)) {
    //....     
   }
   case MotionEvent.ACTION_CANCEL:
   case MotionEvent.ACTION_UP: {
          //..
         stopNestedScroll();
            break;
   }

Ce code ne concerne que l'implémentation d'AbsListView v21 + . Si vous cochez AbsListView avec API 20 ou une version inférieure, vous ne trouverez aucune référence de défilement imbriquée.

7
Gabriele Mariotti

Vous devez mettre gridview dans NestedScrollview comme d'habitude, puis vous devez ajouter dynamiquement la hauteur de gridview. alors tout fonctionnerait bien. !!!

 <Android.support.v4.widget.NestedScrollView
       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:layout_gravity="fill_vertical"
               Android:fillViewport="true">


               <LinearLayout
                   Android:layout_width="match_parent"
                   Android:layout_height="match_parent"
                   Android:orientation="vertical">

              <GridView
               Android:id="@+id/camp_list"
               Android:layout_width="fill_parent"
               Android:layout_height="fill_parent"
               Android:layout_below="@id/toolbar"
               Android:layout_margin="10dp"
               Android:gravity="center"
               Android:horizontalSpacing="10dp"
               Android:numColumns="3"
               Android:stretchMode="columnWidth"
               Android:verticalSpacing="10dp"
               Android:visibility="visible" >
           </GridView>



               </LinearLayout>
           </Android.support.v4.widget.NestedScrollView>
5
Anantha Babu

Pour plus de commodité, j'ai créé une sous-classe avec la nouvelle solution ViewCompat:

public class CoordinatedListView extends ListView {

    public CoordinatedListView(Context context) {
        super(context);
        init();
    }

    public CoordinatedListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CoordinatedListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    @RequiresApi(api = Build.VERSION_CODES.Lollipop)
    public CoordinatedListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    private void init() {
        ViewCompat.setNestedScrollingEnabled(this, true);
    }
}

Prendre plaisir :)

0
Shirane85

Cela fonctionne pour moi. 

https://Gist.github.com/sakurabird/6868765

J'utilise GridView dans NestedScrollView 

0
Kishan Vaghela