Desplácese mediante programación hasta la parte superior de un NestedScrollView


82

¿Hay alguna manera de desplazarse programáticamente a la parte superior de un NestedScrollViewactivando también los eventos de desplazamiento para el padre? smoothScrollTo(x, y)no delega los eventos de desplazamiento al NestedScrollingParent.


Aclare más su pregunta, ¿quiere decir cuándo NestedScrollView está dentro del diseño del coordinador?
Pier Betos

para desplazarse programáticamente a cualquier punto, consulte stackoverflow.com/questions/52083678/…
user1506104

Respuestas:


106
NestedScrollView.scrollTo(0, 0);

7
Le estoy diciendo que use NestedScrollView.scrollTo(0, 0);para desplazarse hasta la parte superior del archivo NestedScrollView. De nada.
SilentKnight

Esto se aplica más generalmente tanto a ScrollView como a NestedScrollView.
Robert

42

Logré hacerlo (desplazamiento animado):

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
if (behavior != null) {
    behavior.onNestedFling(coordinatorLayout, appBarLayout, null, 0, 10000, true);
}

donde 10000es la velocidad en la dirección y.


1
si solo desea desplazarse para ocultar el diseño de la barra de aplicaciones, como en mi caso, podría hacer behavior.onNestedFling(coordinator, appbar, null, 0, -params.height, true);para revertirlobehavior.onNestedFling(coordinator, appbar, null, 0, params.height, true);
k0sh

3
Gracias. ¿Alguna idea de cómo desplazarse hasta la parte inferior de la vista de desplazamiento anidada?
Bibu

Cuando se expande AppBarLayout, la simulación de la aventura anidada la colapsará (lo cual es genial), pero no hará que NestedScrollView se desplace hacia abajo al mismo tiempo ...
Raphael Royer-Rivard

Además, cuando AppBarLayout está completamente contraído, usar un valor de velocidad y negativo no lo expandirá.
Raphael Royer-Rivard

33

Otra forma de suavizar el desplazamiento NestedScrollViewhacia arriba o hacia abajo es usando la fullScroll(direct)función

nestedScrollView.fullScroll(View.FOCUS_DOWN);
nestedScrollView.fullScroll(View.FOCUS_UP);

fullScroll (View.FOCUS_UP) la barra de aplicaciones oculta no aparece. Cualquier idea
Shabbir Dhangot

@Sabbir Dhangot, ¿diseñó su NestedScrollViewdebajo de la barra de aplicaciones?
MeLine

Tengo una pregunta, puedo ver que fullScroll recibe una vista. si quiero desplazarme a una determinada vista de texto, editexto o reciclador, ¿se desplazará hasta ella?
Felipe Franco

22

Nada funcionó para mí, y realmente no sé por qué funcionó, pero aquí está mi solución y problema.

Al agregar la vista de reciclador a una vista de desplazamiento anidada, mostraba la vista de reciclador en la pantalla al llegar a esa actividad. Para desplazarme hacia arriba, tuve que usar esto:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.details_recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setItemAnimator(new DefaultItemAnimator());
ProductDescriptionAdapter adapter = new ProductDescriptionAdapter(this);
adapter.setData(mProduct.getDetails());
recyclerView.setAdapter(adapter);
NestedScrollView scrollView = (NestedScrollView) findViewById(R.id.scroll);
scrollView.getParent().requestChildFocus(scrollView, scrollView);

5
Wooooow, esto es mejor, damet Garm
abbasalim

11
Si el problema de alguien es que la vista de reciclaje dentro de la vista de desplazamiento anidada ya se ha desplazado a la mitad al ingresar a la actividad, intente configurar el elemento más superior debajo de la raíz de XML para que tenga la siguiente propiedad android: focusableInTouchMode = "true"
user1025013

1
Esta solución funciona perfectamente donde como scrollView.scrollTo (0,0); No funciona del todo.
taranjeetsapra

4
Esto funcionó:scrollView.getParent().requestChildFocus(scrollView, scrollView);
Rajeev Sahu

1
Trabajado como un encanto. Gracias
Vinoth ios

21

También me enfrenté a un escenario similar. En mi caso, cuando me desplazo hacia abajo para terminar, debería aparecer el botón FAB y cuando el usuario toque ese botón FAB debería ir a la parte superior de la página. Para eso, agregué la respuesta de @SilentKnight NestedScrollView.scrollTo(0, 0);Para ir a la parte superior, pero que no es suficiente para una animación suave para desplazarse hacia arriba.
Para una animación fluida, he usado la respuesta de @Sharj, que es NestedScrollView.fullScroll(View.FOCUS_UP); Pero luego mi AppBar no es visible, por lo tanto, tengo que expandir la AppBar de la siguiente manera appBarLayout1.setExpanded(true). Entonces, usando estos tres puedo ir sin problemas a la parte superior de la página.

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.scrollTo(0,0);
appBarLayout1.setExpanded(true);

5
appBarLayout1.setExpanded (verdadero); - ¡trabajó para mi! Gracias :)
Andrei

¡Gracias! Esta es la respuesta más correcta, especialmente cuando se usa appbarlayout
demogorgorn

11

Fácilmente podría simular el desplazamiento en el nivel NestedScrollView. Básicamente, le dice al coordinatorLayout que acaba de desplazarse por la altura de la barra de herramientas.

    NestedScrollView nestedScrollView = (NestedScrollView) getActivity().findViewById(R.id.your_nested_scroll_view);

    int toolbarHeight = getActivity().findViewById(R.id.toolbar).getHeight();

    nestedScrollView.startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL);
    nestedScrollView.dispatchNestedPreScroll(0, toolbarHeight, null, null);
    nestedScrollView.dispatchNestedScroll(0, 0, 0, 0, new int[]{0, -toolbarHeight});
    nestedScrollView.scrollTo(0, nestedScrollView.getBottom());

¡La única respuesta que funcionó para mí! Necesitaba desplazarme hacia arriba en el diseño del coordinador (tanto nestedScrollView como collapsibleToolbar). Utilicé el código existente, pero toolbarHeight cambió a Integer.MIN_VALUE y -toolbarHeight a Integer.MAX_VALUE (ya que necesito la dirección opuesta). Y luego llamo appBarLayout.setExpanded (true, true); ¡Gracias!
Viktoriia Chebotar

9

Puede usar esto para un desplazamiento suave.

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.smoothScrollTo(0,0);

O para desplazamiento normal

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.scrollTo(0,0);

Trabajo Gr8. Me ahorras tiempo
Priyanka G

7

Probé todas las respuestas anteriores, nada parecía funcionar, pero solo necesitaba un postDelayed.

    scrollview.postDelayed(new Runnable() {
        @Override
        public void run() {
            listener.setAppBarExpanded(false, true); //appbar.setExpanded(expanded, animated);
            scrollview.fullScroll(View.FOCUS_DOWN);
        }
    }, 400);

6

Algún tiempo NestedScrollView.scrollTo(0, 0);yscrollview.pageScroll(View.FOCUS_UP); no funciona

En eso necesitas usar fling()ysmoothScrollTo() juntos

CÓDIGO DE MUESTRA

nestedScrollView.post {
   nestedScrollView.fling(0)
   nestedScrollView.smoothScrollTo(0, 0)
}

2

Agregue la línea dos veces. Funcionó para mí

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.fullScroll(View.FOCUS_UP);

1

Use View.scollTo (int x, int y) en su lugar para desplazarse hasta la parte superior.

findViewById({your NestedScrollView resource id}).scrollTo(0, 0);

0

Tuve un problema con NestedScrollView cuando lo usé que con RecyclerView. Este código funcionó para mí: nestedScrollView !!. GetParent (). RequestChildFocus (nestedScrollView, nestedScrollView);

    val recyclerViewSearch = activity?.findViewById<RecyclerView>(R.id.recycler)
    recyclerViewSearch.setAdapter(setAdapterSearch())

    val nestedScrollView = activity?.findViewById<NestedScrollView>(R.id.bottom_sheet_Search)
    nestedScrollView!!.getParent().requestChildFocus(nestedScrollView, nestedScrollView);

0

Así es como me desplazo a un elemento de RecyclerView cuando RecyclerView está dentro de NestedScrollView

Primero, obtenga y item heightluego desplácese hasta el positionque desee.

val itemHeight =
    binding.calendarRecyclerView.findViewHolderForAdapterPosition(0)!!.itemView.height
binding.nestedScrollView2.smoothScrollTo(0, position * itemHeight)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.