2010-07-22 12 views
85

Estoy mostrando algunos datos en un ScrollView. En el inicio de actividad (método onCreate) llene el ScrollView con datos y deseo desplazarme hacia abajo.Cómo desplazarse hacia abajo en un ScrollView en el inicio de la actividad

He intentado 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 manera de desplazar el ScrollView a la parte inferior en el inicio de la actividad? Eso significa que la vista ya se desplazó hacia abajo cuando se muestra por primera vez.

+0

Esto también explica por qué me estaba 0 todo el tiempo cuando yo estaba tratando de utilizar getMeasuredWidth mientras inicialización mi propia subclase de un ScrollView. – Ghoti

Respuesta

196

Tiene que ser hecho 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 "nueva" de abajo.

+1

Estoy intentando exactamente esto pero parece que todavía no funciona ... ¿está llamando al código anterior en 'onCreate' de la' Activity' que contiene? – pstanton

+0

Lo estoy haciendo en onStart – Palo

+3

En su lugar post() usa postDelayed() con 100ms de retraso. funcionará desde cualquier punto del ciclo de vida de las actividades. –

15

Usted 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"> 
+0

¡Esto realmente funcionó para mí! ¡Accesorios! –

+0

¡Eso es genial! :) –

+8

Esto solo funciona si la vista de desplazamiento es una vista de lista. –

42

Coloque el código siguiente después de añadir los datos:

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

Para mí, esto solo funcionaba con un postDelay en lugar de publicar. Solo 100 milisegundos de retraso. –

+0

Perfecto. Por supuesto, con combo con scrollview.fullScroll (ScrollView.FOCUS_UP); – KNU

25

Esto funciona para mí:

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

Impresionante. Gracias. – Proverbio

+1

La mejor respuesta para esta pregunta hasta ahora. Muchos de los otros enfoques son condicionales, pero este es impresionante n funciona súper bien :) – rana

3

Justo después anexa datos a la vista agregue esta sola línea:

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN); 
+0

funcionó para mí :) – Smaran

3

probar este

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

Ésta es la mejor manera de hacer esto.

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

         } 
        }); 
       } 
1

Después de inicializar su componente de IU y completarlo con datos. añadir los línea a su método de crear

Runnable runnable=new Runnable() { 
     @Override 
     public void run() { 
      scrollView.fullScroll(ScrollView.FOCUS_DOWN); 
     } 
    }; 
    scrollView.post(runnable); 
0
scrollView.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      scrollView.fullScroll(ScrollView.FOCUS_DOWN); 
     } 
    },1000); 
Cuestiones relacionadas