¿Hay alguna manera de identificar si listview se está desplazando hacia arriba o hacia abajo?¿Cómo detectar si una vista de lista se desplaza hacia arriba o hacia abajo en Android?
OnScrollListener no me ayuda en este caso.
¡Gracias de antemano!
¿Hay alguna manera de identificar si listview se está desplazando hacia arriba o hacia abajo?¿Cómo detectar si una vista de lista se desplaza hacia arriba o hacia abajo en Android?
OnScrollListener no me ayuda en este caso.
¡Gracias de antemano!
se trata de una aplicación sencilla:
lv.setOnScrollListener(new OnScrollListener() {
private int mLastFirstVisibleItem;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if(mLastFirstVisibleItem<firstVisibleItem)
{
Log.i("SCROLLING DOWN","TRUE");
}
if(mLastFirstVisibleItem>firstVisibleItem)
{
Log.i("SCROLLING UP","TRUE");
}
mLastFirstVisibleItem=firstVisibleItem;
}
});
Solo es útil una vez que el artículo superior ya no es el primer artículo.No le dirá la dirección si se desplaza hacia adelante y hacia atrás mientras el mismo elemento permanece en la parte superior. – AndroidDev
Hay un método en ScrollViews
que informa sobre el desplazamiento de las volutas. Se llama onScrollChanged()
. Sin embargo, se declara protegido, por lo que debe crear una clase contenedora para obtener acceso. Para el uso del método, verifique los documentos de Android.
En primer lugar, crear una interfaz para exponer el método protegido
public interface OnScrollListener {
void onScrollChanged(int x, int y, int oldx, int oldy);
}
Entonces, crear su envoltorio y extender ScrollView
public class ReportingScrollView extends ScrollView {
private OnScrollListener onScrollListener = null;
public ReportingScrollView(Context context) {
super(context);
}
public ReportingScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public ReportingScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setOnScrollListener(OnScrollListener onScrollListener) {
this.onScrollListener = onScrollListener;
}
@Override
protected void onScrollChanged(int x, int y, int oldx, int oldy) {
super.onScrollChanged(x, y, oldx, oldy);
if (onScrollListener != null) {
onScrollListener.onScrollChanged(x, y, oldx, oldy);
}
}
}
Por último, incluirlo en su diseño de XML como una vista personalizada, y adjuntar oyentes como de costumbre.
<your.package.ReportingScrollView />
scrollingandtrolling.setOnScrollListener(new OnScrollListener() {...});
Esto solo parece ser llamado cuando arrojas la lista, no se llama repetidamente. –
La solución dada por algunos Estudiante Noob es bueno: hay que crear un contenedor a utilizar el onScrollChanged protegida (int x, int y, int oldx , int oldy), que se activa más a menudo que el estándar AbsListView.OnScrollListener.onScrollStateChanged (vista de AbsListView, int scrollState).
Lamentablemente, onScrollChanged() siempre devuelve 0 como parámetros, sin importar cómo me desplazo, y parece detectar solo cuando el desplazamiento finaliza, llegando a la parte superior o inferior de la lista.
Utilicé el siguiente código para detectar la dirección correcta del desplazamiento: utiliza el getTop() del primer elemento visible pero también utiliza su posición para comprender cuándo el primer elemento no es más visible; durante esta transición de elemento, la dirección de desplazamiento viene dada por la posición del elemento.
@Override
public void onScrollChanged(int x, int y, int oldx, int oldy) {
if(listView.getChildAt(0) != null) {
int scrollingDir = NO_SCROLLING;
int firstChildTop = listView.getChildAt(0).getTop();
if (listView.getFirstVisiblePosition() == mLastFirstVisiblePosition) {
if (mLastFirstChildTop < firstChildTop) {
//Scrolling DOWN
scrollingDir = SCROLLING_DOWN;
} else if (mLastFirstChildTop > firstChildTop) {
//Scrolling UP
scrollingDir = SCROLLING_UP;
}
} else if(listView.getFirstVisiblePosition() > mLastFirstVisiblePosition) {
//Scrolling UP
scrollingDir = SCROLLING_UP;
} else {
//Scrolling DOWN
scrollingDir = SCROLLING_DOWN;
}
mLastFirstVisiblePosition = listView.getFirstVisiblePosition();
mLastFirstChildTop = firstChildTop;
switch(scrollingDir) {
case SCROLLING_DOWN:
//Your DOWN scrolling code here
break;
case SCROLLING_UP:
//Your UP scrolling code here
break;
default:
case NO_SCROLLING:
break;
}
}
}
list.setOnScrollListener(new OnScrollListener() {
int last_item;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if(last_item<firstVisibleItem+visibleItemCount-1){
System.out.println("List is scrolling upwards");
}
else if(last_item>firstVisibleItem+visibleItemCount-1){
System.out.println("List is scrolling downwards");
}
last_item = firstVisibleItem+visibleItemCount-1;
}
});
Aquí basado en el último elemento visible decido si la lista se va hacia arriba o hacia abajo
Una solución fácil y de trabajo.
private int lastPosition = -1;
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
if(lastPosition == firstVisibleItem)
{
return;
}
if(firstVisibleItem > lastPosition)
{
Logger.print("Going Down");
}
else
{
Logger.print("Going Up");
}
lastPosition = firstVisibleItem;
}
funcionó perfectamente, gracias! – error1337
para quienes nunca todavía en busca de una respuesta para Kotlin, esto funciona para que
MainListView.setOnScrollListener(object :AbsListView.OnScrollListener {
// var VisibleItem: Int = 0
override fun onScroll(p0: AbsListView?, FirstVisibleItem: Int, i2: Int, i3: Int) {
/*
if(VisibleItem < FirstVisibleItem)
{
Toast.makeText(applicationContext,"Scrolling Down",Toast.LENGTH_SHORT).show()
fab.hide()
}
if(VisibleItem >FirstVisibleItem)
{
fab.show()
Toast.makeText(applicationContext,"Scrolling Up",Toast.LENGTH_SHORT).show()
}
VisibleItem=FirstVisibleItem;
*/
}
override fun onScrollStateChanged(p0: AbsListView?, p1: Int) {
if (p1 == 1) {
fab.hide()
} else {
fab.show()
}
}
})
}
Descomentar utilizar un método alternativo.
exactamente ¿qué quieres? puede explicar más ... –
Quiero hacer algunos códigos cuando la lista se desplaza hacia arriba, y hacer otro código cuando la lista se desplaza hacia abajo. por lo tanto, quiero detectar si se desplaza hacia arriba o hacia abajo – dor506
Ver este http://stackoverflow.com/questions/6358428/implementation-of-onscrolllistener-to-detect-the-end-of-scrolling-in-a-listview –