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
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.
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
utilisation -
ViewCompat.setNestedScrollingEnabled(listView/gridview,true); (add Android Support v4 Library 23.1 or +)
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.
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.
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>
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 :)
Cela fonctionne pour moi.
https://Gist.github.com/sakurabird/6868765
J'utilise GridView dans NestedScrollView