studio programacion herramientas fundamentos con avanzado aplicaciones android listview scroll scroll-offset

programacion - manual de android en pdf



Android ListView ubicación de desplazamiento actual Y píxeles (3)

No hay ninguna noción de scroll en 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 / desplazamiento en Y de un elemento visible usando el siguiente truco:

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

Estoy intentando 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?

Aquí está el código que traté de usar, pero como dije, solo 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"); } });


Puede probar la implementación de OnTouchListener y anular su onTouch(View v, MotionEvent event) y obtener el x y el y utilizando 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 .


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

Llamar al oyente Scroll

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(); } } });

función 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; }