Cómo desplazarse hacia abajo en un ScrollView al inicio de la actividad


96

Estoy mostrando algunos datos en un ScrollView. Al iniciar la actividad (método onCreate), lleno ScrollView con datos y quiero desplazarme hasta la parte inferior.

Traté de usar getScrollView().fullScroll(ScrollView.FOCUS_DOWN). Esto funciona cuando lo hago como una acción al hacer clic en el botón, pero no funciona en el método onCreate.

¿Hay alguna forma de desplazar ScrollView hacia la parte inferior al iniciar la actividad? Eso significa que la vista ya se desplazó hacia la parte inferior cuando se muestra por primera vez.


Esto también explica por qué obtenía 0 todo el tiempo cuando intentaba usar getMeasuredWidth mientras inicializaba mi propia subclase de ScrollView.
Ghoti

Respuestas:


218

Debe hacerse de la siguiente manera:

    getScrollView().post(new Runnable() {

        @Override
        public void run() {
            getScrollView().fullScroll(ScrollView.FOCUS_DOWN);
        }
    });

De esta manera, la vista se actualiza primero y luego se desplaza a la parte inferior "nueva".


1
Estoy intentando exactamente esto, pero parece que aún no funciona ... ¿está llamando al código anterior en onCreateel contenedor Activity?
pstanton

Lo estoy haciendo en onStart
Palo

4
En su lugar, post () usa postDelayed () con un retraso de 100 ms. funcionará desde cualquier punto del ciclo de vida de la actividad.
Vitaliy A

50

Coloque el siguiente código después de agregar sus datos:

final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview));
scrollview.post(new Runnable() {
    @Override
    public void run() {
        scrollview.fullScroll(ScrollView.FOCUS_DOWN);
    }
});

4
Para mí, esto solo funcionó con un postDelayed en lugar de un post. Solo 100 milisegundos de retraso.
Andreas Rudolph

Perfecto. Por supuesto con combo con scrollview.fullScroll (ScrollView.FOCUS_UP);
ieselisra

30

Esto funciona para mi:

scrollview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        scrollview.post(new Runnable() {
            public void run() {
                scrollview.fullScroll(View.FOCUS_DOWN);
            }
        });
    }
});

2
La mejor respuesta para esta pregunta hasta ahora. Muchos otros enfoques son condicionales, pero este es increíble y funciona muy bien :)
rana

17

Puede hacer esto en el archivo de diseño:

                android:id="@+id/listViewContent"
                android:layout_width="wrap_content"
                android:layout_height="381dp" 
                android:stackFromBottom="true"
                android:transcriptMode="alwaysScroll">

8
 scrollView.postDelayed(new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    },1000);

4

Prueba esto

    final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview));
    scrollview.post(new Runnable() {
       @Override
       public void run() {
         scrollview.fullScroll(ScrollView.FOCUS_DOWN);
       }
    });

3

Inmediatamente después de agregar datos a la vista, agregue esta única línea:

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN);

1

Después de inicializar su componente UI y llenarlo con datos. agregue esas líneas a su método de creación

Runnable runnable=new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    };
    scrollView.post(runnable);

1

Esta es la mejor forma de hacer esto.

scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            scrollView.post(new Runnable() {
                @Override
                public void run() {
                    scrollView.fullScroll(View.FOCUS_DOWN);
                }
            });
        }
});
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.