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.

lukas1994
fuente
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);
Caballero silencioso
fuente
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.

lukas1994
fuente
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);
Sharj
fuente
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);
Vulovic Vukasin
fuente
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);
Vidu
fuente
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());
usuario1259201
fuente
¡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);
Ali Akram
fuente
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);
MontDeska
fuente
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)
}
AskNilesh
fuente
2

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

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.fullScroll(View.FOCUS_UP);
Saljith Kj
fuente
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);
Sokdara Cheng
fuente
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);
Maryam Azhdari
fuente
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)
Abdurahman Popal
fuente