Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Ocultación de ActionBar en RecyclerView / ListView onScroll

En mi aplicación conseguí una actividad con algún tipo de barra de acción en la parte superior y la vista de lista debajo de ella. Lo que quiero hacer es desplazarse hacia arriba con la lista, por lo que se oculta y, a continuación, cuando la lista se desplaza hacia abajo – que debe desplazarse hacia abajo con la lista, como si fuera sólo sobre el borde superior de la pantalla. ¿Cómo puedo lograr esta funcionalidad?

  • Android: RecyclerView dentro del viewpager vertical
  • Desplazamiento vertical automático TextView con texto que contiene un enlace de sitio web
  • 7 Solutions collect form web for “Ocultación de ActionBar en RecyclerView / ListView onScroll”

    Actualizado 03/06/2015:

    Google ahora apoya esto usando el CoordinatorLayout .

     <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:layout_scrollFlags="scroll|enterAlways" /> <android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" /> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end|bottom" android:layout_margin="@dimen/fab_margin" android:src="@drawable/ic_done" /> 

    Fuente: https://github.com/chrisbanes/cheesesquare/blob/master/app/src/main/res/layout/include_list_viewpager.xml

    Documentado aquí: https://developer.android.com/reference/android/support/design/widget/AppBarLayout.html

    Original Respuesta:

    Ejemplo similar a las aplicaciones de Google Play Música y Umano:

    https://github.com/umano/AndroidSlidingUpPanel

    Echa un vistazo al código en este repositorio. A medida que deslice el panel hacia arriba, la barra ActionBar también se desliza.

    De la demostración :

      getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); SlidingUpPanelLayout layout = (SlidingUpPanelLayout) findViewById(R.id.sliding_layout); layout.setShadowDrawable(getResources().getDrawable(R.drawable.above_shadow)); layout.setAnchorPoint(0.3f); layout.setPanelSlideListener(new PanelSlideListener() { @Override public void onPanelSlide(View panel, float slideOffset) { Log.i(TAG, "onPanelSlide, offset " + slideOffset); if (slideOffset < 0.2) { if (getActionBar().isShowing()) { getActionBar().hide(); } } else { if (!getActionBar().isShowing()) { getActionBar().show(); } } } @Override public void onPanelExpanded(View panel) { Log.i(TAG, "onPanelExpanded"); } @Override public void onPanelCollapsed(View panel) { Log.i(TAG, "onPanelCollapsed"); } @Override public void onPanelAnchored(View panel) { Log.i(TAG, "onPanelAnchored"); } }); 

    Descargar ejemplo aquí:

    https://play.google.com/store/apps/details?id=com.sothree.umano

    Introduzca aquí la descripción de la imagen

    ListView – sin bibliotecas:

    Hace poco quería la misma funcionalidad y esto funciona perfectamente para mí:

    A medida que el usuario se desplaza hacia arriba, la barra de acción se oculta para dar al usuario toda la pantalla con la que trabajar.

    A medida que el usuario se desplaza hacia abajo y deja ir, el ActionBar volverá.

     getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); listView.setOnScrollListener(new OnScrollListener() { int mLastFirstVisibleItem = 0; @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (view.getId() == listView.getId()) { final int currentFirstVisibleItem = listView.getFirstVisiblePosition(); if (currentFirstVisibleItem > mLastFirstVisibleItem) { // getSherlockActivity().getSupportActionBar().hide(); getSupportActionBar().hide(); } else if (currentFirstVisibleItem < mLastFirstVisibleItem) { // getSherlockActivity().getSupportActionBar().show(); getSupportActionBar().show(); } mLastFirstVisibleItem = currentFirstVisibleItem; } } }); 

    RecyclerView – sin bibliotecas

      this.mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { int mLastFirstVisibleItem = 0; @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); final int currentFirstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition(); if (currentFirstVisibleItem > this.mLastFirstVisibleItem) { MainActivity.this.getSupportActionBar().hide(); } else if (currentFirstVisibleItem < this.mLastFirstVisibleItem) { MainActivity.this.getSupportActionBar().show(); } this.mLastFirstVisibleItem = currentFirstVisibleItem; } }); 

    ¡Déjeme saber si usted necesita más ayuda!

    Experimentar el parpadeo ya que ocultando / mostrando el ActionBar el espacio disponible para los cambios de diseño de contenido, lo que provoca un relayout. Con esto también cambia el índice de la posición del primer elemento visible (puede verificar esto desconectando mLastFirstVisibleItem y currentFirstVisibleItem .

    Usted puede hacer frente a la parpadeo al dejar la ActionBar superponer su diseño de contenido. Para habilitar el modo de superposición para la barra de acción, debe crear un tema personalizado que amplíe un tema de barra de acción existente y establezca la propiedad android: windowActionBarOverlay en true .

    Con esto se puede eliminar el parpadeo, pero la barra de acción se superponen el contenido de su listview. Una solución fácil a esto es fijar el relleno superior del listview (o la disposición de la raíz) a la altura de la barra de acción.

     <ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="?android:attr/actionBarSize" /> 

    Desafortunadamente esto dará lugar a un acolchado constante en la parte superior. Un refinamiento de esta solución es agregar una vista de cabecera a la vista de lista que tiene la altura de ? Android: attr / actionBarSize (y quitar el padding superior establecido anteriormente)

    Lo que está buscando se llama patrón de retorno rápido , aplicado a la barra de acción. Aplicación Google IO 2014 utilizar exactamente eso. Lo uso en una de mis aplicaciones, puedes comprobar el código fuente de esa aplicación de Google para ver cómo lo obtuvieron. La clase BaseActivity es donde tienes lo que necesitas, lee el código y extrae sólo esa funcionalidad específica. ¡Disfruta de la codificación! 🙂

    Estoy seguro de que no es la mejor solución. Pero no he encontrado una mejor todavía. Espero que sea útil.

      static boolean scroll_down; ... mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (scroll_down) { actionBar.hide(); } else { actionBar.show(); } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (dy > 70) { //scroll down scroll_down = true; } else if (dy < -5) { //scroll up scroll_down = false; } } }); 

    Tengo un pensamiento que es una buena idea.

     listView.setOnScrollListener(new OnScrollListener() { int mLastFirstVisibleItem = 0; @Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { case OnScrollListener.SCROLL_STATE_FLING: if (view.getId()==lv_searchresult_results.getId()){ final int currentFirstVisibleItem=lv_searchresult_results.getFirstVisiblePosition(); if(currentFirstVisibleItem>mLastFirstVisibleItem){ ObjectAnimator.ofFloat(toolbar, "translationY", -toolbar.getHeight()).start(); else if(currentFirstVisibleItem<(mLastFirstVisibleItem)){ ObjectAnimator.ofFloat(toolbar, "translationY", 0).start(); } mLastFirstVisibleItem= currentFirstVisibleItem; } if(lv_searchresult_results.getLastVisiblePosition() == myAdapter.getListMap().size()){ if(myAdapter.getListMap().size() < allRows&&!upLoading){ } } break; case OnScrollListener.SCROLL_STATE_IDLE: if (view.getFirstVisiblePosition()<=1){ ObjectAnimator.ofFloat(toolbar, "translationY", 0).start(); } if(lv_searchresult_results.getLastVisiblePosition() == myAdapter.getListMap().size()){ if(myAdapter.getListMap().size() < allRows&&!upLoading){ } } break; 

    Creo que funcionará bien

     listView.setOnScrollListener(new OnScrollListener() { int mLastFirstVisibleItem = listView.getLastVisiblePosition(); boolean isScrolling = false; @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if(scrollState == 0) isScrolling = false; else if(scrollState == 1) isScrolling = true; else if(scrollState == 2) isScrolling = true; } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (view.getId() == myTeamListView.getId()) { if(isScrolling) { final int currentFirstVisibleItem = myTeamListView.getLastVisiblePosition(); if (currentFirstVisibleItem > mLastFirstVisibleItem) { ((AppCompatActivity)getActivity()).getSupportActionBar().hide(); } else if (currentFirstVisibleItem < mLastFirstVisibleItem) { ((AppCompatActivity)getActivity()).getSupportActionBar().show(); } mLastFirstVisibleItem = currentFirstVisibleItem; } } } }); 

    Si está utilizando un CoordinatorLayout, aquí está el truco.

     <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" /> 

    La app:layout_scrollFlags="scroll|enterAlways" hará que nuestra barra de herramientas se desplace fuera de la pantalla cuando el usuario desplaza hacia abajo la lista y tan pronto como empieza a desplazarse hasta la barra de herramientas se mostrará de nuevo.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.