5

Sto sviluppando un'applicazione che mostra una lista di giochi, all'interno di itemView di ogni gioco, ho anche un elenco di video da mostrare. l'anteprima e la struttura stanno seguendo.C'è un modo per condividere uno stesso LayoutManager tra più RecyclerViews nidificate

enter image description here

schiero un RecyclerView come la vista della radice della finestra, e poi per i video, ho usato griglia in stile RecyclerView per visualizzare, ecco abbiamo ottenuto una struttura RecyclerView nidificato.

Ma c'è un problema perché il numero di video è incoerente tra i giochi, non voglio che il RecyclerView dell'elenco dei video sia in grado di scorrere, quindi il modo migliore è rendere l'altezza della vista allungata in modo dinamico dipende da quante righe avere. Ho sentito una conclusione deludente ha detto che non c'è un modo per ottenere questo da internet. È davvero? qualsiasi alternativa può farlo?

Finora su questa domanda, non ho idea di risolverlo, quindi cambio manualmente l'altezza del RecyclerView come soluzione temporanea.

videoGridRecyclerView.getLayoutParams().height = rowCount * 242; 

Dato che gli elementi video sono completamente stessa struttura, sarebbe bello se quelle RecyclerViews possono riutilizzare itemViews di quel video di una volta che già strisciare fuori con lo schermo, essa provvede prende molto meglio miglioramento delle prestazioni.

Quindi ho provato ad avere un particolare RecycledViewPool da propagare a ogni RecyclerViews annidato.

public class MainActivity extends Activity { 
    private RecyclerView.RecycledViewPool mViewPool; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // create the RecycledViewPool from first and re-use for each nested RecyclerViews. 
     mViewPool = new RecyclerView.RecycledViewPool(); 
     ... 
    } 
} 

Anche ho fatto questo sforzo, continuo a notare che il metodo onCreateViewHolder in corso e il contatore gonfiare ottenere aumento durante i strisciare la RecyclerView radice circolarmente.

private static class VideoAdapter extends RecyclerView.Adapter<GridViewHolder> { 
    private List<Video> mVideoList; 

    private VideoAdapter(List<Video> videoList) { 
     mVideoList = videoList; 
    } 

    // this method would always invoke during i swipe the RecyclerView. 
    @Override 
    public GridViewHolder onCreateViewHolder(ViewGroup container, int viewType) { 
     Log.e("", String.format("createViewCount : %d", ++MainActivity.STAT_GAME_VIDEO_ITEM_COUNT)); 
     return new GridViewHolder(inflate(container, R.layout.game_video_item)) {}; 
    } 
} 

Questa idea funzionerà? o lo sto facendo male? Voglio raggiungere questo effetto, qualsiasi altro consiglio, anche se non si tratta di RecyclerView sarebbe riconoscente, grazie in anticipo.

risposta

3

A questo punto, ho utilizzato GridLayout anziché il RecyclerView nidificato e le viste di riciclaggio all'interno di GridLayout. Ma probabilmente non è un buon modo perché la mia logica di riciclaggio era molto semplice. L'applicazione è ancora un po 'balbettante mentre lo scorrimento veloce, non l'ho capito. Come conclusione valida, inserisco il mio codice in github. Si prega di avvisarmi se avete idee, grazie.

2

Sì, quello che stai facendo è giusto.

Basta creare un RecyclerViewPool (come hai fatto) e consegnarlo a tutte le istanze di RecyclerView tramite setRecycledViewPool. In questo modo, condivideranno lo stesso pool di visualizzazioni.

Si consiglia di aumentare la dimensione della cache per evitare di sbalzare le viste quando il numero di visualizzazioni tra gli elementi è molto diverso.

Btw, come suggerimento laterale, provare a unirlo in un RecyclerView anziché in RecyclerViews nidificate. In questo modo, le animazioni, ecc. Possono funzionare molto meglio. Inoltre, lo scorrimento nella stessa direzione è problematico quando si utilizza RV all'interno di RV e si può evitare tale problema unendoli in uno solo.

+2

nel mio caso, c'è ancora un modo per ottenere solo utilizzare un RecyclerView? che dire della griglia video di dimensioni incerte? ad essere onesti, non voglio nidificare RecyclerViews, ma non riesco a trovare un altro approccio per soddisfare il mio desiderato, se capisco i tuoi mezzi in modo errato, puoi mostrare il mio qualche illustrazione o codice? – VinceStyling

+0

@yigit Come si aumenta la dimensione della cache? Sto facendo setMaxRecycledViews() che aiuta un po 'ma posso vedere che onCreateViewHolder() è chiamato troppo. Non capisco perché siano state create alcune viste anziché riciclate. Non sono nemmeno sicuro di cosa passare come il primo parametro del metodo setMaxRecycledViews(). I miei riciclatori potrebbero avere 1 articolo o fino a 20 e sembra che quando arrivo ai 20 articoli uno, le visualizzazioni non sono state riciclate. C'è un posto dove posso guardare degli esempi o avere più informazioni sulla condivisione dei pool nelle viste del riciclatore? Grazie. – Sotti