Design lib – CoordinatorLayout / CollapsingToolbarLayout con GridView / listView

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

Pero esto funciona con NestedScrollView y RecyclerView

Diseño

Debajo está mi archivo de diseño-

             

Cualquier ayuda sería apreciada.

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 para Now CoordinatorLayout solo funciona con RecyclerView y NestedScrollView

EDITAR:

utilizar –

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

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

 ViewCompat.setNestedScrollingEnabled(listView,true); 

Lo probé con Android Support v4 Library 23.1 y funciona bien.

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

Para obtener este comportamiento, debe establecer:

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

No es suficiente implementar NestedScrollingChild . 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 está solo en la implementación de AbsListView v21 +. Si comprueba AbsListView con API 20 o inferior, no encontrará ninguna referencia de desplazamiento nested.

Tienes que poner gridview dentro de NestedScrollview como de costumbre, entonces tienes que agregar la altura de la vista de grilla dinámicamente. entonces todo funcionaría bien.

        

Esto es trabajo para mí.

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

Yo uso GridView dentro de NestedScrollView

Para mayor comodidad, creé 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); } } 

Disfruta 🙂