2015-08-04 18 views
8

Sto creando una vista simile a EPG per la quale ho più orizzontale RecyclerView s (come programmi TV) incapsulato all'interno di un LinearLayout. Quando faccio scorrere uno dei RecyclerView, voglio far scorrere il resto delle viste insieme.Scorri più RecyclerView orizzontale insieme

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    layoutContent.setWeightSum(epg.getChannels().size()); 

    //prepare recycler views and add into layoutContent based on epg channels 
    for(EPG.Channel ch : epg.getChannels()){ 
     AppLog.error(TAG, "Creating RecyclerView for: " + ch.getDisplayName()); 

     //create new recycler view 
     final RecyclerView rv = new RecyclerView(layoutContent.getContext()); 
     lstRecyclerViews.add(rv); 

     //set layout manager 
     rv.setLayoutManager(new LinearLayoutManager(layoutContent.getContext(), LinearLayoutManager.HORIZONTAL, false)); 

     //create adapter 
     rv.setAdapter(new MyAdapter(ch.getPrograms())); 
     rv.setItemAnimator(new DefaultItemAnimator()); 

     //add into parent layout 
     LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0); 
     lp.weight = 1; 
     layoutContent.addView(rv, lp); 
    } 
} 

Ho provato ad aggiungere un ascoltatore di scorrimento per le mie opinioni, ma io sono confuso con RecyclerView.OnScrollListener s' onScrolled metodo come io non riesco a capire come per scorrere altre viste.

Qualsiasi aiuto/suggerimento sarebbe utile.

TV Channels' view

+0

non è StaggeredGridLayoutManager che dovrebbe essere usato qui? – pskink

+0

@pskink Forse hai ragione, l'uso di 'LinearLayoutManager' non è una decisione finale :) ma anche se utilizzo la visualizzazione sfalsata, quindi come faccio a scorrere tutte le RecyclerViews tutte insieme quando si scorre una delle viste? – waqaslam

+0

con SGLM hai solo un RV – pskink

risposta

2

HorizontelScrollView

{

layout lineare

{

elenco verticale di vista riciclatore orizzontali, esclusione di vista riciclatore orizzontale di LayoutManager
canScr metodo oolhorizontally() per restituire false, in modo che siano tutti scorrere insieme secondo ScrollView Grand Parent.

}

Il nostro obiettivo principale è quello di scorrere quella lista verticale di opinioni riciclatore orizzontali in senso orizzontale, prima ho cercato di mantenere tutti loro su una visione di scorrimento orizzontale, ma questo è qualcosa che il sistema Android rifiuta chiaramente , quindi ho mantenuto uno schema lineare (nel mio caso orientato verticalmente) come mediatore.

così la griglia epg ora può scorrere verticalmente come sono all'interno di una vista di riciclatore verticale così come in orizzontale a causa della vista di scorrimento orizzontale. e non dovremmo permettere alla lista orizzontale di scorrere in modo indipendente, così ho esteso il gestore di layout e non ho consentito lo scorrimento orizzontale, ora scorrono solo sotto lo scroll di grandParent.

+0

Si prega di elaborare un po 'sulla vostra risposta, vedere: [Come rispondere.] (Http://stackoverflow.com/help/how-to-answer) – agold

+0

@agold, grazie per il feedback, ho cercato di spiegare in questa modifica . –

1

È necessario sempre ricalcolare la posizione degli articoli correnti nelle viste del riciclatore orizzontale (h.r.v. successivo) Dopo aver eseguito lo scorrimento in un h.r.v. ricalcola le posizioni di altri in base a una piccola quantità di movimento di scorrimento occorsa in h.r.v.

Quindi eseguire l'override onViewAttachedToWindow nell'adattatore e utilizzare il metodo scrollToPositionWithOffset da LinearLayoutManager di h.r.v in particolare per impostarlo sulla posizione corretta.

Inoltre, durante il calcolo del movimento dx, non dimenticare di disattivare il metodo quando il dito è inattivo per evitare la gestione multipla dello stesso evento.

0

FlexboxLayout (prodotto da Google) consente di creare qualcosa come questo con un RecyclerView e un FlexboxLayoutManager. Dal suo version 3.0 (28 giugno 2017) puoi trascinarlo orizzontalmente.

Per esempio, usare in questo modo:

FlexboxLayoutManager layoutManager = new FlexboxLayoutManager(getActivity()); 
    layoutManager.setFlexDirection(FlexDirection.ROW); 
    layoutManager.setFlexWrap(FlexWrap.WRAP); 
    recyclerView.setLayoutManager(layoutManager); 

E non dimenticate di impostare la larghezza della vostra RecyclerView ad un numero più grande rispetto alle dimensioni dello schermo, in modo da scorrere, non utilizzare match_parent:

<android.support.v7.widget.RecyclerView 
     android:layout_width="3600dp" 
     android:layout_height="match_parent"/> 

Nota: il ViewHolders sono riciclati per righe, non per le colonne, quindi fate attenzione se si dispone di elementi troppo pesanti su un lunghissimo RecyclerView

Problemi correlati