2009-11-20 24 views
26

Estoy tratando de hacer algo después de detener el desplazamiento. Así que, traté de usar OnScrollListener#onScrollStateChanged(SCROLL_STATE_IDLE) para detectar cuándo se detuvo el desplazamiento (ya sea TOUCH_SCROLL or FLING) (en 1.5 se ejecuta como esperaba). Pero cuando se ejecuta en 2.0, onScrollStateChanged no puede recibir el evento después de soltar el dedo. ¿Hay alguna devolución de llamada o de todos modos para detectar ese evento?cómo detectar Android ListView ¿Se detuvo el desplazamiento?

+0

¿Es la respuesta más adelante aceptable para usted? Si es así, acéptalo, de lo contrario esperaré algún tipo de comentario sobre la respuesta ;-) –

Respuesta

65

Trate de usar el setOnScrollListener e implementar el onScrollStateChanged con scrollState == 0 ... hacer lo que tiene que hacer ...

setOnScrollListener(new OnScrollListener() { 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
     // TODO Auto-generated method stub 
    } 

    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) { 
      Log.i("a", "scrolling stopped..."); 
     } 
    } 
}); 
+23

en lugar de código duro es igual a 0, usa OnScrollListener.SCROLL_STATE_IDLE Esto funcionará si estás tratando de detectar cuándo el desplazamiento se detiene ... si estás tratando de detectar cuando el dedo/arrojadizo ya no toca la pantalla, eso sería un enfoque diferente ... –

+0

Acabo de probar el código anterior con 2.0 y funciona muy bien ... –

7

El truco está en no perder de vista cuando el usuario está arrojando y cuando ellos no son. Parece que esta es la única distinción que puedes hacer porque, como dijiste, las transiciones desde el desplazamiento con el dedo al ralentí son no registradas. Esto es lo que estoy hablando:

public void onScrollStateChanged(AbsListView view, int scrollState) {  
    if (scrollState != OnScrollListener.SCROLL_STATE_FLING) { 
     flinging = false; 
     int count = view.getChildCount(); 

     for (int i = 0; i < count; i++) { 
      View convertView = view.getChildAt(i); 
      Recipe recipe = (Recipe) convertView.getTag(); 
      ImageView image = (ImageView) convertView.findViewById(R.id.icon); 

      if (recipe != null && recipe.getImageURL() != null) { 
       ImageLoader.loadImage(this, image, recipe.getImageURL()); 
      } 
     } 
    } else { 
     flinging = true; 
    } 
} 

Y luego en el adaptador Listview:

public View getView(int position, View convertView, ViewGroup parent) { 
    // Bunch of code.... 

    if (!flinging) { 
     ImageLoader.loadImage(BrowseRecipes.this, image, recipe.getImageURL()); 
    } 
} 

Así, en lugar de reaccionar a los cambios en el oyente, sólo tiene que cargar las imágenes (o lo que sea necesario hacer eso es intensivo) en primer lugar, siempre y cuando no haya aventuras.

todo esto es sacado de mi proyecto aquí: https://github.com/pkulak/mealfire_android

Cuestiones relacionadas