2010-05-19 8 views
14

Tengo una vista de desplazamiento y solo quiero que ocurra un evento si ya se ha desplazado hacia la parte inferior, pero no puedo encontrar la manera de comprobar si la vista de desplazamiento está en la parte inferior.¿Cómo sé que la vista de desplazamiento ya se desplazó hacia la parte inferior?

Lo he resuelto por el contrario; sólo permiten el evento suceda si ya se desplaza a la parte superior:

ScrollView sv = (ScrollView) findViewById(R.id.Scroll); 
    if(sv.getScrollY() == 0) { 
     //do something 
    } 
    else { 
     //do nothing 
    } 

Respuesta

8

Encontré una manera de hacerlo funcionar. Necesitaba verificar la altura medida del niño en ScrollView, en este caso, LinearLayout. Uso el < = porque también debería hacer algo cuando no es necesario desplazarse. Es decir. cuando LinearLayout no es tan alto como ScrollView. En esos casos getScrollY es siempre 0.

ScrollView scrollView = (ScrollView) findViewById(R.id.ScrollView); 
    LinearLayout linearLayout = (LinearLayout) findViewById(R.id.LinearLayout); 
    if(linearLayout.getMeasuredHeight() <= scrollView.getScrollY() + 
      scrollView.getHeight()) { 
     //do something 
    } 
    else { 
     //do nothing 
    } 
+2

Como ScrollView solo puede tener un hijo, donde está seguro de que hay uno: if (scrollView.getScrollY() + scrollView.getHeight()> = scrollView.getChildAt (0) .getMeasuredHeight()) {/ * se han desplazado to bottom * /} – Tom

+0

¿Se colocó esto en un método? ¿Cómo se implementó este código? –

+0

@ItzHoudini Hice esto tan genérico como sea posible para que pueda usarlo de la forma que desee. – sanna

0

Si scrollView.getHeight() == scrollView.getScrollY + Tamaño_de_la_pantalla, a continuación, que se desplaza verticalmente hacia abajo.

+1

Gracias pero cuando el desplazamiento es en el fondo getScrollY = 349 getBottom = 430 getMeasuredHeight = 430 getHeight = 430 Los tres últimos son lo mismo sin importar qué tan abajo me haya desplazado. Lo único que varía es getScrollY. ¿Qué es este tamaño de pantalla que mencionas? ¿Lo mal interpreté? Debería ser 81 en este caso y no puedo pensar en nada que sea eso. – sanna

1

que pueda obtener el desplazamiento máximo para el ancho por hacer este cambio

int maxScroll = yourScrollView.getChildAt(0).getMeasuredWidth() - yourScrollView.getWidth(); 

getWidth() para getHeight() para los puntos de vista de desplazamiento vertical

5

Aquí está:

public class myScrollView extends ScrollView 
{ 
    public myScrollView(Context context) 
    { 
     super(context); 
    } 
    public myScrollView(Context context, AttributeSet attributeSet) 
    { 
     super(context,attributeSet); 
    } 

    @Override 
    protected void onScrollChanged(int l, int t, int oldl, int oldt) 
    { 
     View view = (View)getChildAt(getChildCount()-1); 
     int d = view.getBottom(); 
     d -= (getHeight()+getScrollY()); 
     if(d==0) 
     { 
      //you are at the end of the list in scrollview 
      //do what you wanna do here 
     } 
     else 
      super.onScrollChanged(l,t,oldl,oldt); 
    } 
} 

Puede utilizar myScrollView en el diseño xml o crear una instancia en yo código de ur Sugerencia: con el código anterior si el usuario llega al final de la lista 10 veces con frecuencia, su código se ejecutará 10 veces. En algunos casos, como cuando desea cargar datos desde un servidor remoto para actualizar su lista, ese comportamiento sería indeseable (probablemente). tratar de predecir situaciones indeseadas y evitarlas.

Sugerencia 2: a veces acercarse al final de la lista puede ser el momento adecuado para dejar que se ejecute el script. por ejemplo, el usuario está leyendo una lista de artículos y se está acercando al final. luego empiezas a cargar más antes de que termine la lista. Para ello, basta con hacer esto para cumplir con su objetivo:

if(d<=SOME_THRESHOLD) {} 
+0

gracias: D, pasé un buen rato con el headcache para esto – rkmax

Cuestiones relacionadas