2015-07-06 17 views
19

Sto cercando di rendere il mio loop RecyclerView all'inizio del mio elenco.Come posso creare una RecyclerView circolare (infinita)?

Ho cercato su Internet e sono riuscito a rilevare quando ho raggiunto la fine della mia lista, tuttavia non sono sicuro da dove procedere da qui.

Questo è quello che sto attualmente in uso per rilevare la fine della lista (che si trova here):

@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); 
      } 
     } 
} 

Quando scorrere fino alla fine, vorrei vista per essere visibili, mentre la visualizzazione dei dati dal in cima alla lista o quando si scorre verso l'alto della lista vorrei visualizzare i dati dal fondo della lista.

Ad esempio:

Visualizzazione1 View2 View3 View4 View5

View5 Visualizzazione1 View2 View3 View4

+0

@DamianKozlak RecyclerView non è uguale a ListView –

+1

@ChadBingham non Certo, ma questo problema potrebbe essere risolto utilizzando la stessa soluzione, come in 'ListView'. Entrambi gli adattatori 'ListView' e' RecyclerView' hanno i metodi 'getCount()' e 'getItem()'. –

+0

Hai trovato una soluzione?Sto lavorando allo stesso problema, attualmente sto pensando di scrivere un LayoutManager personalizzato che si estende da LinearLayoutManager. Hai mai raggiunto il tuo obiettivo? –

risposta

42

Non c'è modo di renderlo infinito, ma c'è un modo per farlo sembra infinito.

  1. l'adattatore di esclusione getCount() per tornare qualcosa di grande come Integer.MAX_VALUE:

    @Override 
    public int getCount() { 
        return Integer.MAX_VALUE; 
    } 
    
  2. in getItem() e getView() modulo divide posizione (%) per numero vero elemento:

    @Override 
    public Fragment getItem(int position) { 
        int positionInList = position % fragmentList.size(); 
        return fragmentList.get(positionInList); 
    } 
    
  3. alla fine, imposta l'elemento corrente su qualcosa nel mezzo (altrimenti, sarebbe infinito solo in direzione verso il basso).

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

Ehi, questo è esattamente quello che faccio, ma non posso chiamare smoothScrollToPosition() con valore negativo. Voglio che la mia lista possa essere controllata da dpad e può scorrere verso sinistra e verso destra. – anhtuannd

+0

@anhtuannd Usa MAX_INT/2 o qualsiasi altra come posizione iniziale. – Tunga

+2

Ottima soluzione! Ho aggiunto il codice per una migliore comprensione. :) – Sufian

6

Le altre soluzioni che ho trovato per questo problema il lavoro abbastanza bene, ma penso che ci potrebbero essere alcuni problemi di memoria che ritornano Integer.MAX_VALUE in getCount() il metodo di vista riciclatore.

Per risolvere questo problema, ignorare GetItemCount() Metodo come di seguito:

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

Ora, ovunque si utilizza la posizione per ottenere l'elemento dalla lista, utilizzare sotto

position % itemList.size() 

Ora aggiungere scrollListener alla vista riciclatore

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); 
     } 
    } 
}); 

Infine per avviare lo scorrimento automatico, chiamare il metodo sia bassa

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); 
} 
+0

Buona risposta! Preferisco questo oltre quello accettato. – Sakiboy

+0

mi ha salvato il tempo grazie. –

Problemi correlati