studio programacion para herramientas fundamentos desarrollo con avanzado aplicaciones android android-fragments android-listview android-viewpager android-design-library

programacion - manual android studio avanzado



¿Cómo ocultar y mostrar correctamente la barra de acciones con la API de la nueva biblioteca de diseño? (3)

Basado en la solución del desarrollador @android que a veces expande la barra de la aplicación cuando la lista está completamente desplazada, hice un pequeño cambio expandiendo o contrayendo la lista dependiendo de la cantidad desplazada (si es más grande que la altura del encabezado, luego se expande).

mHeaderHeight = getResources().getDimensionPixelSize(R.dimen.appbar_height); mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); switch (newState) { case RecyclerView.SCROLL_STATE_IDLE: mAppBar.setExpanded(mScrolledAmount < mHeaderHeight , true); break; } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); mScrolledAmount += dy; } });

EDITAR: Lo que funciona aún mejor para mí es tener diferentes umbrales para expandir y colapsar

switch (newState) { case RecyclerView.SCROLL_STATE_IDLE: if (mScrolledAmount < 50){ mAppBar.setExpanded(true , true); } if (mScrolledAmount > mHeaderHeight) { mAppBar.setExpanded(false, true); } break; }

Fondo

Supongamos que tengo estos elementos en la actividad:

  • barra de acciones (en realidad, una barra de herramientas)
  • pestañas (usando TabLayout)
  • ViewPager, con fragmentos.
  • cada fragmento tiene ListVIew / RecyclerView.

Deseo tener el mismo comportamiento que en muchas aplicaciones, que al desplazarse, la barra de acciones se ocultará o se mostrará.

Un ejemplo perfecto para él es cómo funciona el desplazamiento de Play Store.

Algo así (pero con ListView en los fragmentos por supuesto):

El problema

Encontré la biblioteca " Android-ObservableScrollView " que muestra cómo hacerlo para muchos tipos de vistas desplazables, pero no maneja el caso del nuevo uso de TabLayout (además de que tiene problemas), como se muestra en muestras más recientes, como cheesesquare .

En la nueva API de la biblioteca de diseño (que se muestra en el ejemplo de "cheesesquare"), es más automático, por lo que no es necesario crear tanto texto repetitivo para manejar el desplazamiento y qué hacer con él.

Algo como eso:

<android.support.v4.widget.DrawerLayout <android.support.design.widget.CoordinatorLayout> <android.support.design.widget.AppBarLayout> <android.support.v7.widget.Toolbar app:layout_scrollFlags="scroll|enterAlways"/> <android.support.design.widget.TabLayout/> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager app:layout_behavior="@string/appbar_scrolling_view_behavior" /> <android.support.design.widget.FloatingActionButton/> </android.support.design.widget.CoordinatorLayout> <android.support.design.widget.NavigationView/> </android.support.v4.widget.DrawerLayout>

Este contrato promete que las barras de refrigerios estarán debajo de los FAB, y que la barra de acciones se animará automáticamente (se mostrará / ocultará) en función del RecyclerView interno de los fragmentos.

La cosa es que esto parece funcionar solo con RecyclerView y no con ListView.

Como son bastante complejos, será muy difícil convertirlos a RecyclverViews.

La pregunta

¿Qué se necesitaría para hacer que el mecanismo anterior también funcione para ListViews?

¿Hay una manera de hacerlo? ¿Si es así, cómo?

EDITAR: lamentablemente, parece que Google no admitirá este comportamiento para ListView, sino solo para RecyclerView y NestedScrollView (escritos here ).

Así que traté de utilizar la biblioteca " Android-ObservableScrollView ", pero tiene muchos problemas de desplazamiento, incluidos problemas de flirteo.

Ahora he decidido darle Android-ParallaxHeaderViewPager . ¿Puede alguien decirme cómo hacer que funcione en el escenario actual? ¿Es posible?

EDITAR: he decidido convertir a RecyclerView después de todo. Sin embargo, todas las muestras que he intentado muestran un problema: al detenerse para desplazarse, la barra de acciones (y tal vez incluso el FAB) puede quedar truncada, en oposición a la tienda de reproducción, donde se animará para que se oculte / se muestre.

EDITAR: Parece que necesito usar setExpanded cuando tengo IDLE para onScrollStateChanged. La pregunta es cómo decidir cuándo expandirse y cuándo colapsar.


Las nuevas API de diseño son solo para nuevos componentes. Si ese componente admite versiones anteriores, entonces debe funcionar para versiones anteriores.

En relación con su problema: no sé si ha utilizado la Android-ParallaxHeaderViewPager sugerida o no. Pero funciona bien aquí en mi caso. Sé que es una biblioteca muy antigua y debes usar listview para eso. No puedes implementar recyclerview con eso. Pero como quiero tener un efecto muy flexible y suave, lo he probado y funciona muy bien.

También puede hacer un desplazamiento suave de la barra de herramientas con el desplazamiento de Listview y también hacer un efecto de paralaje como lo ha visto en el ejemplo.

Vea estas imágenes para el efecto que he implementado para mi aplicación. Marcar con color rojo es mi barra de herramientas de la aplicación.

Imagen cuando se expande:

Imagen cuando está contraída:

Sugiero probar esa biblioteca para su problema relacionado con la barra de acciones, si no piensa cambiar su vista de lista para reciclar. Pero si desea cambiar su vista de lista a recyclerview, entonces puede usar la nueva API de diseño para tal efecto.

Avíseme si puedo ayudarlo más en este caso.

Sinceramente,

Shreyash

Respuesta actualizada

Supongo que necesitas algo como THIS .

Si es lo que quieres, entonces deberías tener que referir esta library e implementarla de esa manera.

Consulte, Parte1, Parte2 y Parte3 para obtener un efecto similar.

Déjame saber si necesitas algo más.


esta es una buena solución, pero sigue siendo muy diferente de lo que muestra la Play Store:

para cada fragmento, llame algo así:

recyclerView.addOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(final RecyclerView recyclerView, final int newState) { super.onScrollStateChanged(recyclerView, newState); ((MainActivity) getActivity()).onScrollStateChanged(recyclerView, newState); } @Override public void onScrolled(final RecyclerView recyclerView, final int dx, final int dy) { super.onScrolled(recyclerView, dx, dy); ((MainActivity) getActivity()).onScrolled(recyclerView, dx,dy); } });

para la actividad de alojamiento:

public void onScrollStateChanged(final RecyclerView recyclerView, final int newState) { switch (newState) { case RecyclerView.SCROLL_STATE_IDLE: mAppBarLayout.setExpanded(mLastDy <= 0, true); mLastDy = 0; break; } } public void onScrolled(final RecyclerView recyclerView, final int dx, final int dy) { mLastDy = dy == 0 ? mLastDy : dy; }

Aún así, si alguien sabe cómo hacer que funcione bien (utilizando ListView o RecyclerView para los fragmentos), al igual que en Play-Store y otras aplicaciones, escríbalo.