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
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.
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
benutzen -
ViewCompat.setNestedScrollingEnabled(listView/gridview,true); (add Android Support v4 Library 23.1 or +)
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.
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.
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>
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 :)
Das funktioniert für mich.
https://Gist.github.com/sakurabird/6868765
Ich verwende GridView in NestedScrollView