¿Puedo averiguar si mi ListView se desplaza hasta la parte inferior? Con eso quiero decir que el último elemento es completamente visible.
105
Editado :
Dado que he estado investigando este tema en particular en una de mis aplicaciones, puedo escribir una respuesta extendida para futuros lectores de esta pregunta.
Implemente un OnScrollListener
, configure ListView
los suyos onScrollListener
y luego podrá manejar las cosas correctamente.
Por ejemplo:
private int preLast;
// Initialization stuff.
yourListView.setOnScrollListener(this);
// ... ... ...
@Override
public void onScroll(AbsListView lw, final int firstVisibleItem,
final int visibleItemCount, final int totalItemCount)
{
switch(lw.getId())
{
case R.id.your_list_id:
// Make your calculation stuff here. You have all your
// needed info from the parameters of this function.
// Sample calculation to determine if the last
// item is fully visible.
final int lastItem = firstVisibleItem + visibleItemCount;
if(lastItem == totalItemCount)
{
if(preLast!=lastItem)
{
//to avoid multiple calls for last item
Log.d("Last", "Last");
preLast = lastItem;
}
}
}
}
listview
es mistackFromBottom
? Lo intenté,if (0 == firstVisibleItem){//listviewtop}
pero me llaman repetidamente.Respuesta tardía, pero si simplemente desea verificar si su ListView se desplaza completamente hacia abajo o no, sin crear un detector de eventos, puede usar esta declaración if:
Primero comprueba si la última posición posible está a la vista. Luego verifica si la parte inferior del último botón se alinea con la parte inferior de ListView. Puede hacer algo similar para saber si está en la parte superior:
fuente
getChildCount()
devuelve las vistas en el grupo de vistas, que con el reciclaje de vistas no es lo mismo que la cantidad de elementos en el adaptador. Sin embargo, dado que ListView desciende de AdapterView, puede usarlogetCount()
directamente en ListView.La forma en que lo hice:
fuente
Algo en el sentido de:
fuente
Esto funcionó para mí.
fuente
Esto puede ser
fuente
Fue bastante doloroso lidiar con el desplazamiento, detectar cuándo está terminado y, de hecho, está al final de la lista (no al final de la pantalla visible), y activa mi servicio solo una vez, para obtener datos de la web. Sin embargo, ahora funciona bien. El código es el siguiente para beneficio de cualquiera que se enfrente a la misma situación.
NOTA: Tuve que mover el código relacionado con mi adaptador a onViewCreated en lugar de onCreate y detectar el desplazamiento principalmente así:
Aquí RideListSimpleCursorAdapter.REACHED_THE_END es una variable adicional en mi SimpleCustomAdapter que se establece así:
Solo cuando se cumplen ambas condiciones, significa que estoy al final de la lista y que mi servicio se ejecutará solo una vez. Si no capto el REACHED_THE_END, incluso el desplazamiento hacia atrás activa el servicio nuevamente, siempre que el último elemento esté a la vista.
fuente
canScrollVertically(int direction)
funciona para todas las Vistas y parece hacer lo que pidió, con menos código que la mayoría de las otras respuestas. Ingrese un número positivo y, si el resultado es falso, estará en la parte inferior.es decir:
if (!yourView.canScrollVertically(1)) { //you've reached bottom }
fuente
Para ampliar un poco una de las respuestas anteriores, esto es lo que tuve que hacer para que funcionara por completo. Parece haber alrededor de 6dp de relleno incorporado dentro de ListViews, y se estaba llamando a onScroll () cuando la lista estaba vacía. Esto maneja ambas cosas. Probablemente podría optimizarse un poco, pero está escrito más para mayor claridad.
Nota al margen: he probado varias técnicas diferentes de conversión de dp a píxeles, y esta dp2px () ha sido la mejor.
fuente
Todavía no puedo comentar porque no tengo suficiente reputación, pero en la respuesta de @Ali Imran y @Wroclai creo que falta algo. Con ese fragmento de código, una vez que actualice preLast, nunca volverá a ejecutar el registro. En mi problema específico, quiero ejecutar alguna operación cada vez que me desplazo hacia la parte inferior, pero una vez que preLast se actualiza a LastItem, esa operación nunca se vuelve a ejecutar.
}
Con ese "más" ahora puede ejecutar su código (Log, en este caso) cada vez que se desplaza hacia la parte inferior una vez más.
fuente
fuente
Para que su lista llame cuando la lista llegue por última vez y si ocurre un error, esto no volverá a llamar a endoflistview . Este código también ayudará en este escenario.
donde LIST_UP_THRESHOLD_VALUE puede ser cualquier valor entero (he usado 5) donde su lista se desplaza hacia arriba y mientras regresa al final, esto llamará nuevamente al final de la vista de lista.
fuente
Encontré una forma muy agradable de cargar automáticamente el siguiente conjunto de páginas de una manera que no requiere la suya propia
ScrollView
(como lo requiere la respuesta aceptada).En ParseQueryAdapter hay un método llamado
getNextPageView
que está ahí para permitirle proporcionar su propia vista personalizada que aparece al final de la lista cuando hay más datos para cargar, por lo que solo se activará cuando haya llegado al final de su conjunto de páginas actual (es la vista "cargar más ..." por defecto). Este método solo se llama cuando hay más datos para cargar, por lo que es un excelente lugar para llamar.DeloadNextPage();
esta manera, el adaptador hace todo el trabajo duro por usted para determinar cuándo se deben cargar nuevos datos y no se llamará en absoluto si tiene llegó al final del conjunto de datos.Luego, dentro de su actividad / fragmento, solo tiene que configurar el adaptador y los nuevos datos se actualizarán automáticamente para usted como por arte de magia.
fuente
Para detectar si el último elemento está completamente visible , puede agregar un cálculo simple en la parte inferior del último elemento visible de la vista por
lastItem.getBottom()
.fuente
Yo fui con:
fuente
En el método
getView()
(de unaBaseAdapter
clase derivada) se puede comprobar si la posición de la vista actual es igual a la lista de elementos en elAdapter
. Si ese es el caso, significa que hemos llegado al final / final de la lista:fuente
Encuentro una mejor manera de detectar el final del desplazamiento de la vista de lista en la parte inferior, primero detecta el final del desplazamiento mediante esta
Implementación de onScrollListener para detectar el final del desplazamiento en un ListView
finalmente combine la respuesta de Martijn
fuente
¡Muchas gracias a los carteles en stackoverflow! Combiné algunas ideas y creé un detector de clases para actividades y fragmentos (por lo que este código es más reutilizable, lo que hace que el código sea más rápido de escribir y mucho más limpio).
Todo lo que tienes que hacer cuando tienes mi clase es implementar la interfaz (y, por supuesto, crear un método para ella) que está declarado en mi clase y crear el objeto de esta clase pasando argumentos.
fuente
Debe agregar un recurso de pie de página xml vacío a su listView y detectar si este pie de página es visible.
Luego, en su oyente de desplazamiento listView, haga esto
fuente
Si establece una etiqueta en una vista del último elemento de la vista de lista, más tarde puede recuperar la vista con la etiqueta, si la vista es nula es porque la vista ya no se carga. Me gusta esto:
entonces, si necesita saber si se cargó el último artículo
fuente
Janwilx72 tiene razón, pero su min sdk es 21, así que creo este método:
para ScrollOrientation:
Tal vez tarde, solo para los que llegan tarde
fuente
Si está utilizando un adaptador personalizado con su vista de lista (¡la mayoría de la gente lo hace!) ¡Aquí se ofrece una hermosa solución!
https://stackoverflow.com/a/55350409/1845404
El método getView del adaptador detecta cuando la lista se ha desplazado hasta el último elemento. También agrega corrección para las raras ocasiones en que se llama a una posición anterior incluso después de que el adaptador ya haya renderizado la última vista.
fuente
Hice eso y funciona para mí:
fuente
Esto se desplazará hacia abajo en su lista hasta la última entrada.
fuente