Me gustaría cambiar ListView
a RecyclerView
. Quiero usar el onScroll
de OnScrollListener
enRecyclerView
para determinar si un usuario se desplazó hasta el final de la lista.
¿Cómo sé si un usuario se desplaza hasta el final de la lista para poder obtener nuevos datos de un servicio REST?
cwac-endless
paraListView
.Respuestas:
Gracias a @Kushal y así es como lo implementé
No olvides agregar
fuente
StaggeredGridLayoutManager
mLayoutManager.findLastCompletelyVisibleItemPosition()==mLayoutManager.getItemCount()-1
findFirstVisibleItemPosition()
no se hayan resuelto, deben cambiarRecyclerView.LayoutManager
aLinearLayoutManager
loading = true
nuevo?loading = true
después de la//Do pagination
parte. de lo contrario, este código se ejecutará solo una vez y no podrá cargar más elementos.Haz estas variables.
Establecer en Desplazar para ver la vista del reciclador.
y para una cuadrícula
Diviértete con tus pergaminos sin fin !! ^. ^
Dado que Android ahora admite oficialmente Kotlin, aquí hay una actualización para el mismo:
Make OnScrollListener
y agréguelo a su RecyclerView como este
Para un ejemplo de código completo, no dude en consultar este repositorio de Github .
fuente
findFirstVisibleItemPosition()
método solo está disponible con LinearLayoutManager, no puedo entender cómo hacerlo funcionar.visibleItemCount = mLayoutManager.getChildCount();
comporta igual que usarvisibleItemCount = mRecyclerView.getChildCount();
.int[] firstVisibleItemPositions = new int[yourNumberOfColumns]; pastVisiblesItems = layoutManager.findFirstVisibleItemPositions(firstVisibleItemPositions)[0];
Para aquellos que solo desean recibir una notificación cuando se muestre totalmente el último elemento, pueden usarlo
View.canScrollVertically()
.Aquí está mi implementación:
Nota: puede usar
recyclerView.getLayoutManager().canScrollVertically()
si desea admitir API <14.fuente
RecyclerView
, tendrá suerte nuevamente, porque simplemente puede hacer una copia estática de,View.canScrollVertically()
ya que los métodos relacionados están marcados como públicos en lugar de protegidosRecyclerView
. También puedes extenderRecyclerView
para volver a implementarcanScrollVertically()
si lo desea. Una tercera y simple forma es llamarrecyclerView.getLayoutManager().canScrollVertically()
. Editado en mi respuesta.Aquí hay otro enfoque. Funcionará con cualquier administrador de diseño.
Para una comprensión detallada, escribí una publicación de blog y un proyecto de ejemplo, consígalo aquí http://sab99r.com/blog/recyclerview-endless-load-more/
MyAdapter.java
MyActivity.java
fuente
Mi respuesta es una versión modificada de Noor. Pasé de un
ListView
lugar que teníaEndlessScrollListener
(que puedes encontrar fácilmente en muchas respuestas en SO) a un,RecyclerView
así que quería unEndlessRecyclScrollListener
actualizar fácilmente mi oyente anterior.Así que aquí está el código, espero que ayude:
fuente
Para mí es muy simple:
Tenga cuidado con los trabajos asincrónicos: el mLoading debe cambiarse al final de los trabajos asincrónicos. ¡Espero que sea de ayuda!
fuente
La mayoría de las respuestas suponen los
RecyclerView
usos aLinearLayoutManager
, oGridLayoutManager
, o inclusoStaggeredGridLayoutManager
, o suponen que el desplazamiento es vertical u horyzontal, pero nadie ha publicado una respuesta completamente genérica .ViewHolder
Claramente, usar el adaptador no es una buena solución. Un adaptador puede tener más de 1RecyclerView
usándolo. "Adapta" sus contenidos. Debería ser la Vista de reciclador (que es la clase responsable de lo que se muestra actualmente al usuario, y no el adaptador que es responsable solo de proporcionar contenidoRecyclerView
) lo que debe notificar a su sistema que se necesitan más elementos (para carga).Aquí está mi solución, usando nada más que las clases abstraídas de RecyclerView (RecycerView.LayoutManager y RecycerView.Adapter):
fuente
LayoutManagers
menos un momento: mueva su código de cálculo en otro método scrollListener, muévalo a suonScrollStateChanged
lugaronScrolled
. Y enonScrollStateChanged
solo verificar:if(newState == RecyclerView.SCROLL_STATE_IDLE) { // calculation code }
Aunque la respuesta aceptada funciona perfectamente, la solución a continuación utiliza addOnScrollListener ya que setOnScrollListener está en desuso y reduce el número de variables y, si las condiciones.
fuente
Aunque hay tantas respuestas a la pregunta, me gustaría compartir nuestra experiencia de crear la vista de lista sin fin. Recientemente implementamos Carousel LayoutManager personalizado que puede funcionar en el ciclo desplazando la lista infinitamente y hasta cierto punto. Aquí hay una descripción detallada sobre GitHub .
Le sugiero que eche un vistazo a este artículo con recomendaciones breves pero valiosas sobre la creación de LayoutManagers personalizados: http://cases.azoft.com/create-custom-layoutmanager-android/
fuente
Con el poder de las funciones de extensión de Kotlin, el código puede verse mucho más elegante. Ponga esto donde quiera (lo tengo dentro de un archivo ExtensionFunctions.kt):
Y luego úsalo así:
Esta solución se basa en la respuesta de Kushal Sharma. Sin embargo, esto es un poco mejor porque:
onScrollStateChanged
lugar deonScroll
. Esto es mejor porqueonScroll
se llama cada vez que hay algún tipo de movimiento en RecyclerView, mientrasonScrollStateChanged
que solo se llama cuando se cambia el estado de RecyclerView. El usoonScrollStateChanged
le ahorrará tiempo de CPU y, como consecuencia, batería.fuente
SwipeRefreshLayout's setOnRefreshListener the addOnScrolledToEnd is not working
en la clase interna privada PullToRefresh: SwipeRefreshLayout.OnRefreshListener {override fun onRefresh () {pbViewMore !!. Visibilidad = View.GONE pageCount = 0 courseList.clear () // llamando a asynctask aquí srlNoMessageRefreshLayout !!. IsRefout! ! .isRefreshing = false}}Así es como lo hago, simple y breve:
fuente
OK, lo hice usando el método onBindViewHolder de RecyclerView.Adapter.
Adaptador:
Fragmento (o Actividad) :
fuente
onBindViewHolder()
, funciona de maravilla. La implementación es pequeña en comparación con el oyente de desplazamiento y es más fácil de usar.Mi forma de detectar el evento de carga no es detectar el desplazamiento, sino escuchar si se adjuntó la última vista. Si se adjuntó la última vista, considero que es el momento de cargar más contenido.
fuente
Intentaría extender el método usado
LayoutManager
(por ejemploLinearLayoutManager
) y anularscrollVerticallyBy()
. En primer lugar, llamaríasuper
primero y luego verificaría el valor entero devuelto. Si el valor es igual a0
entonces se alcanza un borde inferior o superior. Entonces usaríafindLastVisibleItemPosition()
método para averiguar qué borde se alcanza y cargar más datos si es necesario. Solo una idea.Además, incluso puede devolver su valor de ese método permitiendo un desplazamiento excesivo y mostrando el indicador de "carga".
fuente
fuente
onScrollStateChanged()
no funcionará, ya que solo se llamará cuando cambie el estado del desplazamiento y no mientras esté desplazándose. Debes usar elonScrolled()
método.Logré una implementación de tipo de desplazamiento infinito usando esta lógica en el
onBindViewHolder
método de miRecyclerView.Adapter
clase.Con este código, cuando RecyclerView llega al último elemento, incrementa la página actual y las devoluciones de llamada en una interfaz que es responsable de cargar más datos de la API y agregar los nuevos resultados al adaptador.
¿Puedo publicar un ejemplo más completo si esto no está claro?
fuente
Para personas que usan StaggeredGridLayoutManager aquí está mi implementación, funciona para mí.
fuente
Hay una biblioteca fácil de usar para este paginado llamado . Admite ListView y RecyclerView (LinearLayout, GridLayout y StaggeredGridLayout).
Aquí está el enlace al proyecto en Github
fuente
Crea una clase abstracta y extiende RecyclerView.OnScrollListener
en actividad (o fragmento) agregue addOnScrollListener a recyclerView
fuente
Tengo un ejemplo bastante detallado de cómo paginar con un RecyclerView. En un nivel alto, tengo un PAGE_SIZE establecido, digamos 30. Entonces solicito 30 elementos y si obtengo 30, solicito la siguiente página. Si obtengo menos de 30 elementos, señalizo una variable para indicar que se ha alcanzado la última página y luego dejo de solicitar más páginas. Compruébalo y hazme saber lo que piensas.
https://medium.com/@etiennelawlor/pagination-with-recyclerview-1cb7e66a502b
fuente
Aquí mi solución usando AsyncListUtil , en la web dice: Tenga en cuenta que esta clase usa un solo subproceso para cargar los datos, por lo que es adecuado para cargar datos del almacenamiento secundario, como el disco, pero no de la red. pero estoy usando odata para leer los datos y trabajar bien. Echo de menos en mi ejemplo entidades de datos y métodos de red. Incluyo solo el adaptador de ejemplo.
fuente
@kushal @abdulaziz
¿Por qué no usar esta lógica en su lugar?
fuente
end_of_list
condición solo se llamará una vez. El indicador_isLastItem
es una variable global en la actividad que tiene un valor predeterminado defalse
. Lo que hice fue ejecutar una tarea en segundo plano después de detectar el final de la lista, recuperar la página siguiente y luego notificar al adaptador del nuevo conjunto de datos, y finalmente configurarlo_isLastItem
en falso nuevamente.Prueba a continuación:
fuente
LoadMoreRecyclerView
WrapperLinearLayout
// Añádelo en xml como
OnCreate o onViewCreated
callYourService
fuente
También es posible implementar sin el oyente de desplazamiento, utilizando solo la lógica pura del modelo de datos. La vista de desplazamiento requiere obtener elementos por posición, así como el recuento máximo de elementos. El modelo puede tener la lógica de fondo para buscar los elementos necesarios en fragmentos, en lugar de uno por uno, y hacer esto en el hilo de fondo, notificando la vista cuando los datos estén listos.
Este enfoque permite tener la cola de recuperación que prefiere los elementos solicitados más recientemente (por lo que actualmente son visibles) sobre los envíos más antiguos (lo más probable es que ya estén desplazados), controle el número de subprocesos paralelos para usar y cosas por el estilo. El código fuente completo para este enfoque (aplicación de demostración y biblioteca reutilizable) está disponible aquí .
fuente
Hay un método
public void setOnScrollListener (RecyclerView.OnScrollListener listener)
en https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#setOnScrollListener%28android.support.v7.widget.RecyclerView.OnScrollListener%29 . Usa esoEDITAR:
Anular
onScrollStateChanged
método dentro deonScrollListener
y hacer estofuente
onScrollStateChanged
onScrollStateChanged
no funcionará, ya que solo se llamará cuando cambie el estado del desplazamiento y no mientras esté desplazándose.onScrollStateChanged
determinar que el usuario se desplaza al último elemento?Verifique que todo se explica en detalle: Paginación usando RecyclerView de la A a la Z
loadMoreItems ():
en MyAdapter:
fuente
Ninguna de estas respuestas tiene en cuenta si la lista es demasiado pequeña o no.
Aquí hay un código que he estado usando que funciona en RecycleViews en ambas direcciones.
fuente
Te dejo mi aproximación. Funciona bien para mi.
Espero que te ayude.
fuente
Esta solución funciona perfectamente para mí.
fuente