2012-10-04 34 views
29

Estoy tratando de detectar cuándo se desplaza una vista de lista más allá de cierto umbral fijo en píxeles (a la mitad del primer elemento). Desafortunadamente, getScrollY() de listview parece devolver siempre 0 instad de la posición de desplazamiento. ¿Hay alguna forma de obtener la ubicación de desplazamiento real por píxel?Android ListView ubicación de desplazamiento actual Y píxeles

Aquí está el código Traté de usar, pero como se ha dicho, sólo devuelve 0.

getListView().setOnScrollListener(new AbsListView.OnScrollListener() { 
    public void onScroll(AbsListView view, int firstVisibleItem, 
         int visibleItemCount, int totalItemCount) { 
     Log.d("scroll", "scroll: " + getListView().getScrollY()); 
    } 

    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     if (scrollState == 0) 
     Log.d("scroll", "scrolling stopped"); 
    } 
}); 
+0

El correcto [solución] (http://stackoverflow.com/questions/12727594/android-listview-current-scroll-location- y-pixels/35594825 # 35594825) – Sarasranglt

Respuesta

49

No hay ninguna noción de desplazamiento Y para un ListView en Android simplemente porque la altura total del contenido es desconocida. Solo se conoce la altura del contenido mostrado.

Sin embargo, es posible obtener la posición actual/Y de desplazamiento de un elemento visible usando este truco: Código

getListView().getChildAt(0).getTop(); 
+1

Probablemente se refiera a esta solución http://stackoverflow.com/a/3035521/1276636 – Sufian

+0

Esa es una muy buena pista, thx @Cyril Mottier :) – JakeP

+7

esto ya no funciona. tiene que agregar la altura de todos los elementos anteriores de la primera vista visible a esa pieza de código. Algunas aplicaciones internas han cambiado recientemente. Espero que la API sea útil para incluir una función simple para obtener este valor en algún momento. Todas las soluciones que existen son hackish y están destinadas a romper con futuras versiones de API. Uno nunca debe meterse con las vistas de un niño de una lista –

0

Usted puede tratar de implementar OnTouchListener y anular su onTouch(View v, MotionEvent event) y obtener la x e y usando event.getX() y event.getY(). Acababa de crear una demostración para deslizar en la fila de ListView que habilitará un botón de eliminar para eliminar un elemento particular de ListView. Puede verificar el código fuente de mi github como ListItemSwipe.

+4

Esta no es una opción para el eje y, ya que 'ListView' se desplaza en función de la velocidad del' MotionEvent'. –

0

Un refactor de la respuesta de Malachiasz. Esta función se usa para la altura de la fila dinámica.

Call oyente OnScroll función

mListView.setOnScrollListener(new AbsListView.OnScrollListener() { 
      @Override 
      public void onScrollStateChanged(AbsListView view, int scrollState) { 

      } 

      @Override 
      public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
       if (mCardsListView.getChildCount() > 0) { 
        int scrollY = getScrollY(); 
       } 
      } 
     }); 

getScrollY

private Dictionary<Integer, Integer> mListViewItemHeights = new Hashtable<Integer, Integer>(); 
private int getScrollY() { 
     View child = mCardsListView.getChildAt(0); //this is the first visible row 
     if (child == null) return 0; 

     int scrollY = -child.getTop(); 

     mListViewItemHeights.put(mCardsListView.getFirstVisiblePosition(), child.getHeight()); 

     for (int i = 0; i < mCardsListView.getFirstVisiblePosition(); ++i) { 
      Integer hei = mListViewItemHeights.get(i); 

      //Manual add hei each row into scrollY 
      if (hei != null) 
       scrollY += hei; 
     } 

     return scrollY; 
    } 
Cuestiones relacionadas