wake-up-neo.com

Design lib - CoordinatorLayout/CollapsingToolbarLayout mit GridView/listView

Dies könnte eine dumme Frage sein, aber ich konnte Design lib nicht gut verstehen. Ich folge dieser Referenz unterhalb des Layouts erstellen. Der blaue Bereich sollte als Parallaxe fungieren, wenn ich das GridView..__ scrolle. Beim Scrollen des Rasters View passiert jedoch nichts in AppBarLayout. 

Dies funktioniert aber mit NestedScrollView und RecyclerView

Layout

Unten ist meine Layoutdatei-

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

Jede Hilfe wäre dankbar.

27
Tarun Varshney

Mit ListView/GridView funktioniert es nur auf Lollipop, indem folgende Code-

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

Ich denke, jetzt funktioniert CoordinatorLayout nur mit RecyclerView und NestedScrollView

BEARBEITEN:

benutzen -

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

Eine einfache Lösung wurde der Support-Bibliothek hinzugefügt:

ViewCompat.setNestedScrollingEnabled(listView,true);

Ich habe es mit Android Support v4 Library 23.1 getestet - und es funktioniert gut.

13
daemmie

Derzeit haben ListView und GridView das erwartete Verhalten mit CoordinatorLayout nur mit API> 21.

Um dieses Verhalten zu erhalten, müssen Sie Folgendes einstellen:

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

Es reicht nicht aus, die NestedScrollingChild..__ zu implementieren. Die AbsListView wird nicht mit Unterstützungsbibliotheken bereitgestellt, sondern hängt von der auf dem Gerät laufenden SO ab.

Sie müssen einige Methoden in der AbsListView überschreiben. Zum Beispiel können Sie die onInterceptTouchEvent-Methode überprüfen.

In diesem Code sehen Sie:

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

Dieser Code ist nur in der Implementierung von AbsListView v21 + ..__ vorhanden. Wenn Sie die AbsListView mit API 20 oder niedriger überprüfen, finden Sie keine verschachtelten Bildlaufreferenzen.

7

Sie müssen gridview wie gewohnt in NestedScrollview einfügen, dann müssen Sie die gridview-Höhe dynamisch hinzufügen. dann würde alles gut funktionieren !!!

 <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

Zur Vereinfachung habe ich eine Unterklasse mit der neuen ViewCompat-Lösung erstellt:

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

Genießen :)

0
Shirane85

Das funktioniert für mich. 

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

Ich verwende GridView in NestedScrollView 

0
Kishan Vaghela