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.

Palo
fuente
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".

Palo
fuente
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);
    }
});
Harshid
fuente
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);
            }
        });
    }
});
sonida
fuente
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">
Tam Dao
fuente
8
 scrollView.postDelayed(new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    },1000);
Makvin
fuente
4

Prueba esto

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

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

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN);
LEMUEL ADANE
fuente
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);
Ramzy Hassan
fuente
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);
                }
            });
        }
});
rana
fuente