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


Cómo hacer Recycler View no desplazarse cuando se dispara appbar

He hecho la barra de la aplicación snap como este:

Introduzca aquí la descripción de la imagen

Tenga en cuenta que cuando el rollo se deja en el medio (es decir, el título es medio visible, entonces la barra de aplicaciones se encaja automáticamente)

En caso de google play esto es lo que el snap se parece a:

Introduzca aquí la descripción de la imagen

Ahora, quiero que el complemento funcione como el que está en google play. Que es que cuando se produce el snap, sólo la barra de aplicaciones debe encajar y la vista de reciclador no debe moverse. Sería mejor si la solución también apoyaba los dispositivos pre-piruleta.

¡Gracias!

    4 Solutions collect form web for “Cómo hacer Recycler View no desplazarse cuando se dispara appbar”

    He encontrado una solución que funciona bastante bien en mi proyecto. Consta de 2 comportamientos, uno para AppBarLayout y otro para el contenedor de desplazamiento. Puedes encontrarlo en Github aquí: appbar-snap-behavior

    Es muy fácil instalarlo:

    compile "com.github.godness84:appbar-snap-behavior:0.1.1" 

    Recuerde agregar maven { url "https://jitpack.io" } en su raíz build.gradle al final de los repositorios:

     allprojects { repositories { ... maven { url "https://jitpack.io" } } } 

    Entonces:

    1. Agregue la app:layout_behavior="com.github.godness84.appbarsnapbehavior.AppBarSnapBehavior" a su AppBarLayout
    2. app:layout_behavior="com.github.godness84.appbarsnapbehavior.ScrollingViewBehavior" en su contenedor de desplazamiento.

    Desafortunadamente, como el comportamiento predeterminado de AppBarLayout es reemplazado, algunas características ya no están disponibles (por ejemplo AppBarLayout.setExpanded () ), pero en situaciones normales funciona! Pruébalo y házmelo saber.

    Ver mi biblioteca Barra de herramientas retráctil

    Tienes que añadir esto en build.gradle

     compile 'it.michelelacorte.retractabletoolbar:library:1.0.0' 

    Que en su MainActivity.java utilice RecyclerView y esto:

     RetractableToolbarUtil.ShowHideToolbarOnScrollingListener showHideToolbarListener; recyclerView.addOnScrollListener(showHideToolbarListener = new RetractableToolbarUtil.ShowHideToolbarOnScrollingListener(toolbar)); if (savedInstanceState != null) { showHideToolbarListener.onRestoreInstanceState((RetractableToolbarUtil.ShowHideToolbarOnScrollingListener.State) savedInstanceState .getParcelable(RetractableToolbarUtil.ShowHideToolbarOnScrollingListener.SHOW_HIDE_TOOLBAR_LISTENER_STATE)); } 

    Esto es efecto:

    Introduzca aquí la descripción de la imagen

    EDITAR:

    Desde la biblioteca de diseño 23.1.0 puedes añadir el atributo |snap a tu diseño ToolBar:

      <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_scrollFlags="scroll|enterAlways|snap /> 

    Debe ser más o menos lo que está buscando.

    Hola Utilice la siguiente presentación que funcionará exactamente como la aplicación google play store que he probado

     <?xml version="1.0" encoding="utf-8"?> 

     <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="@dimen/appbar_padding_top" android:theme="@style/AppTheme.AppBarOverlay"> <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|snap" app:popupTheme="@style/AppTheme.PopupOverlay"> </android.support.v7.widget.Toolbar> <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/container" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

    También tenga en cuenta que he utilizado la siguiente biblioteca de soporte de diseño

     compile 'com.android.support:design:23.1.1' 

    Hágamelo saber en caso de cualquier problema que sin duda le ayudará en eso.

    He conseguido "pasar por alto" el problema.

    ¡He creado una clase abstracta, la uso en tus proyectos!

    ESTE ES LA DISPOSICIÓN:

     <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="@dimen/status_bar_height" /> <FrameLayout android:id="@+id/appBarLayout" android:layout_width="match_parent" android:layout_height="@dimen/status_bar_app_bar" android:background="@color/appbar" > <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:layout_marginTop="@dimen/status_bar_height" android:background="@color/appbar" /> <android.support.design.widget.AppBarLayout android:id="@+id/tabLayout" android:layout_width="match_parent" android:layout_height="48dp" android:layout_gravity="bottom" android:background="@color/appbar" /> </FrameLayout> </FrameLayout> 

    El framelayout'll será su "nueva" appbar.

    Entonces, sus fragmentos (los del viewpager) deben extender esta clase:

     public abstract class SnappableAppBarFragment extends Fragment { public int scrollAttuale; private boolean attivaSnap = true; private boolean isTouching = false; public void setSnapActivated(boolean state){attivaSnap = state;} public void setUpSnappableAppbar(final View fragMainView, final NestedScrollView nestedScrollView, final FrameLayout appBar, final int actionBarHeight) { nestedScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { @Override public void onScrollChanged() { if (!attivaSnap) return; int scrollY = nestedScrollView.getScrollY(); int differenza = scrollAttuale - scrollY; if (differenza > 0 && appBar.getY() < 0) { //Esci appBar.animate().translationYBy(differenza).setDuration(0).start(); if (appBar.getY() > 0) { appBar.animate().translationY(0).setDuration(0).start(); } } if (differenza < 0 && appBar.getY() > -actionBarHeight) { //Entra appBar.animate().translationYBy(differenza).setDuration(0).start(); if (appBar.getY() < -actionBarHeight) appBar.animate().translationY(-actionBarHeight).setDuration(0).start(); } if (differenza >= -2 && differenza <= 2 && !isTouching ){ int spazioTot = actionBarHeight; if ((Math.abs(appBar.getY()) < spazioTot / 2 || nestedScrollView.getScrollY() <= 200) && appBar.getY() != 0) { //Espandi appBar.animate().translationY(0).setDuration(270).start(); } else if (appBar.getY() != 0) { //Chiudi appBar.animate().translationY(-actionBarHeight).setDuration(270).start(); } } scrollAttuale = scrollY; //Scrolling verso l'alto differenza è positiva //Scrolling verso il basso differenza è negativa } }); fragMainView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (!attivaSnap) return false; if (motionEvent.getAction() == MotionEvent.ACTION_UP) { isTouching = false; Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { int spazioTot = actionBarHeight; // && nestedScrollView.getScrollY() <= 200 && nestedScrollView.getScrollY() <= 200 && nestedScrollView.getScrollY() <= 200 if ((Math.abs(appBar.getY()) < spazioTot / 2 || nestedScrollView.getScrollY() <= 200) && appBar.getY() != 0) { //Espandi appBar.animate().translationY(0).setDuration(270).start(); } else if (appBar.getY() != 0) { //Chiudi appBar.animate().translationY(-actionBarHeight).setDuration(270).start(); } } }, 0); } if (motionEvent.getAction() == MotionEvent.ACTION_DOWN || motionEvent.getAction() == MotionEvent.ACTION_SCROLL) { isTouching = true; } return false; } }); } } 

    Y finalmente, en fragmentos:

      public class Fragment1 extends SnappableAppBarFragment { ... @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment viewPrincipale = inflater.inflate(R.layout.fragment_home, container, false); mainActivity = (MainActivity) getActivity(); setUpSnappableAppbar(viewPrincipale, (NestedScrollView) viewPrincipale.findViewById(R.id.nestedScrollView), parentAppBar, actionBarHeight); ... } public void setParentAppBar(FrameLayout frameLayout) { parentAppBar = frameLayout; } public void setActionBarHeight(int height) { actionBarHeight = height; } ... } 

    Eventualmente, al declarar fragmentos, defina parentappbar y actionbarheight de la actividad:

     fragment1.setParentAppBar((FrameLayout) findViewById(R.id.appBarLayout)); fragment1.setActionBarHeight(toolbar.getLayoutParams().height); 

    Eso es, lo siento si es largo, pero es la única manera que encontré para hacer que funcione!

    También, lo siento por mal inglés, soy un desarrollador italiano: P Bye

    EDIT: ¡IMPORTANTE !! CAMBIO EN SNAPPABLEAPPBARFRAGMENT ESTO: final int actionBarHeight TO final float actionBarHeight !!! SERÁ SUELENTE: D

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