java android android-6.0-marshmallow android-collapsingtoolbarlayout coordinator-layout

java - Diseño lib-CoordinatorLayout/CollapsingToolbarLayout con GridView/listView



android android-6.0-marshmallow (6)

Esta podría ser una pregunta tonta, pero no entendí bien el diseño lib. Estoy siguiendo esta referencia para crear el siguiente diseño. El área azul debería funcionar como paralaje cuando muevo el GridView . Pero cuando me desplazo de la cuadrícula, no ocurre nada en AppBarLayout.

Pero esto funciona con NestedScrollView y RecyclerView

A continuación se encuentra mi archivo de diseño-

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

Cualquier ayuda sería apreciada.


Actualmente, ListView y GridView tienen el comportamiento esperado con CoordinatorLayout solo con API> 21.

Para obtener este comportamiento tienes que configurar:

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

No es suficiente implementar el NestedScrollingChild . El AbsListView no se implementa con bibliotecas de soporte, entonces depende del SO que se ejecuta en el dispositivo.

Debe anular algunos métodos en AbsListView. Por ejemplo, puede verificar el método onInterceptTouchEvent .

Dentro de este código puedes ver:

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

Este código solo se encuentra en la implementación de AbsListView v21 +. Si verifica AbsListView con API 20 o inferior, no encontrará ninguna referencia de desplazamiento anidado.


Con ListView / GridView, funciona solo en Lollipop siguiendo el código

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

Creo que, por ahora, CoordinatorLayout solo funciona con RecyclerView y NestedScrollView

EDITAR:

utilizar -

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


Debe colocar gridview dentro de NestedScrollview como de costumbre y luego agregar dinámicamente el alto de gridview. entonces todo funcionaría 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>



Para mayor comodidad, he creado una subclase con la nueva solución 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); } }

Disfrutar :)


Se agregó una solución simple a la biblioteca de soporte:

ViewCompat.setNestedScrollingEnabled(listView,true);

Lo he probado con el soporte de Android v4 Library 23.1 y funciona bien.