2012-02-06 11 views
6

Tengo un ScrollView con LinearLayout dentro y estoy agregando TextViews. Pero siempre quiero que el último TextView agregado sea visible, por lo que necesito ScrollView para desplazarme a la parte inferior, cuando se agrega un TextView. No sé por qué, pero cuando llamo scrollto(), scrollby() o fullScroll() después de agregar una vista de texto, solo se desplaza a la vista de texto antes de la última.¿Cómo mantener un ScrollView para desplazarse hacia la parte inferior?

¿Conoces una mejor manera de hacerlo?

¡Muchas gracias!

Código:

Tengo un botón, que llama a esta función:

private void addRound() { 
    // TODO Auto-generated method stub 
    TextView newRound = new TextView(Stopwatch.this); 
    newRound.setText("" + counter + ". - " + timerText()); 
    newRound.setTextSize(20); 
    newRound.setGravity(Gravity.CENTER); 
    linlay.addView(newRound); 
    counter++; 
} 

Después de llamar a esta función que llamo fullScroll().

addRound(); 
sv.fullScroll(View.FOCUS_DOWN); 

sv ist mi ScrollView, linlay es el LinearLayout dentro del ScrollView.

+0

Probablemente deberías usar ListView para este propósito y usar list.setSelection (int index); fácilmente. –

+0

¿Puedo reducir un ListView para que sea solo una parte de un diseño? – TheBrillowable

+1

¿Podríamos ver el código que está utilizando para determinar dónde desplazarse y desplazarse realmente en ScrollView? –

Respuesta

11

supongo que es porque el ScrollView no es del todo actualizada en el momento de llamar sv.scrollFull(View.FOCUS_DOWN); Pruebe lo siguiente (para reemplazar su segundo ejemplo de código):

addRound(); 
sv.post(new Runnable() { 

    @Override 
    public void run() { 
    sv.fullScroll(View.FOCUS_DOWN); 
    } 
}); 

Si lo anterior no funciona, intente lo siguiente (no es una manera elegante de hacerlo pero puede funcionar):

addRound(); 
sv.postDelayed(new Runnable() { 

    @Override 
    public void run() { 
    sv.fullScroll(View.FOCUS_DOWN); 
    } 
}, 100); 

Espero que esto funcione!

+0

La primera opción funciona bien con aparentemente ningún problema de rendimiento notable, ¡muchas gracias! – TheBrillowable

+0

No actualizado del todo. ¡Eso es! Finalmente resolvió mi problema. No necesitó el postDelayed, la publicación normal fue suficiente. – Michel

+0

Gracias, el código postDelayed funcionó siempre para mí, el primer código solo funcionaba a veces. – user3560827

0

Otro enfoque es utilizar ViewTreeObserver.OnGlobalLayoutListener. Agregue este fragmento de código en el método onCreate().

linlay.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      sv.fullScroll(View.FOCUS_DOWN); 
     } 
    }); 
Cuestiones relacionadas