¿Cómo creo un RecyclerView circular (sin fin)?

Estoy intentando hacer que mi bucle RecyclerView vuelva al inicio de mi lista.

He buscado en todo Internet y he logrado detectar cuando he llegado al final de mi lista, sin embargo, no estoy seguro de dónde proceder desde aquí.

Esto es lo que estoy usando actualmente para detectar el final de la lista (que se encuentra aquí ):

  @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { visibleItemCount = mLayoutManager.getChildCount(); totalItemCount = mLayoutManager.getItemCount(); pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition(); if (loading) { if ( (visibleItemCount+pastVisiblesItems) >= totalItemCount) { loading = false; Log.v("...", ""+visibleItemCount); } } } 

Cuando se desplaza hasta el final, me gustaría que las vistas sean visibles mientras que los datos que se muestran en la parte superior de la lista o cuando se desplazan a la parte superior de la lista mostraría los datos de la parte inferior de la lista.

Por ejemplo:

View1 View2 View3 View4 View5

View5 View1 View2 View3 View4

No hay forma de hacerlo infinito, pero hay una manera de hacer que parezca infinito.

  1. en su adaptador anula getCount() para devolver algo grande como Integer.MAX_VALUE :

     @Override public int getCount() { return Integer.MAX_VALUE; } 
  2. en getItem() y getView() dividir módulo (%) por número de artículo real:

     @Override public Fragment getItem(int position) { int positionInList = position % fragmentList.size(); return fragmentList.get(positionInList); } 
  3. al final, coloca el elemento actual en algo en el medio (o de lo contrario, sería infinito solo en dirección descendente).

     // scroll to middle item recyclerView.getLayoutManager().scrollToPosition(Integer.MAX_VALUE / 2); 

Las otras soluciones que encontré para este problema funcionan bastante bien, pero creo que puede haber algunos problemas de memoria que devuelven Integer.MAX_VALUE en el método getCount () de la vista de reciclador.

Para solucionarlo, anule el método getItemCount () como se indica a continuación:

 @Override public int getItemCount() { return itemList == null ? 0 : itemList.size() * 2; } 

Ahora, donde sea que esté utilizando la posición para obtener el elemento de la lista, use debajo

 position % itemList.size() 

Ahora agrega scrollListener a tu vista de reciclador

 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) super.onScrolled(recyclerView, dx, dy); int firstItemVisible = linearLayoutManager.findFirstVisibleItemPosition(); if (firstItemVisible != 0 && firstItemVisible % itemList.size() == 0) { recyclerView.getLayoutManager().scrollToPosition(0); } } }); 

Finalmente, para iniciar el desplazamiento automático, llame al siguiente método

 public void autoScroll() { final Handler handler = new Handler(); final Runnable runnable = new Runnable() { @Override public void run() { recyclerView.scrollBy(2, 0); handler.postDelayed(this, 0); } }; handler.postDelayed(runnable, 0); }