support setnestedscrollingenabled setitemviewcachesize sethasfixedsize recyclerview getadapter addonitemtouchlistener android android-recyclerview appcompat onscrolllistener

android - setnestedscrollingenabled - setitemviewcachesize



RecyclerView OnScrollListener() Problema (2)

Tengo alrededor de 32 registros en json, estoy usando RecyclerView para mostrarlos y he implementado OnScrollListener (...)

Pregunta

Inicié una Actividad, busqué los 32 registros, ahora cuando me desplazo, ¿por qué vuelvo a obtener los mismos 32 registros una y otra vez, cada vez que me desplazo, aquí está mi implementación de OnScrollListener ()

public void initializeOnScrollForRecyclerView() { mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { int visibleItemCount = recyclerView.getLayoutManager().getChildCount(); int totalItemCount = recyclerView.getLayoutManager().getItemCount(); int pastVisiblesItems = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition(); if (!isLoading) { if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) { isLoading = true; mPostPresenter.loadPosts(false); } } } }); }


Estás usando esto

if ((visibleItemCount + pastVisiblesItems) >= totalItemCount)

Lo que significa que una vez que haya visto 22 registros, estará cargando nuevamente. Y mientras carga de nuevo, obtiene los mismos datos y los agrega a su lista.

Veo que estás usando RXjava. Cuando se suscribe en loadPost compruebe qué datos está emitiendo su observable. Creo que está emitiendo los mismos datos de nuevo, es decir, sus 32 registros y esos registros se agregan nuevamente y este es un ciclo sin fin.


La Implementación parece ser correcta, pero para una condición falla, intente cuando dy> 0 como este (también ponga esto en OnCreate of the Activity):

private boolean loading = true; recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (loading) { if (dy > 0) //check for scroll down { visibleItemCount = layoutManager.getChildCount(); totalItemCount = layoutManager.getItemCount(); pastVisiblesItems = layoutManager.findFirstVisibleItemPosition(); if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) { loading = false; Log.v("...", " Reached Last Item"); loadMoreVideos(searchVideos); } } } } });