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