2015-08-29 15 views
9

Ho seguito questo tutorial per implementare i comportamenti sia per nascondere la barra degli strumenti e la FAB quando arrotolato: https://mzgreen.github.io/2015/06/23/How-to-hideshow-Toolbar-when-list-is-scrolling(part3)/esterno Recyclerview che non ricevono gli eventi di scorrimento di Recyclerview interna

ho incollato una demo di ciò che il comportamento appare come di seguito.

scrolling with fab

Ora, invece di quei singoli elementi all'interno della recyclerview nelle schede in possesso di solo un textView, ho codificato in modo che siano in possesso di una foto (ImageView) e sotto di essa, un recyclerview che mostra un elenco di elementi .

Quindi, esiste una panoramica di riciclaggio esterna che contiene un elenco di centri di riciclaggio interni.

Il recyclerview interno non scorre: l'ho disabilitato seguendo la risposta in questo thread sovrascrivendo il metodo canScrollVertically(): Disable Scrolling in child Recyclerview android. Ho anche provato ad abilitare lo scrolling per il recyclerview interno, ma ho riscontrato lo stesso problema.

Il riciclabile esterno scorre e presenta il comportamento che mostra/nasconde la barra degli strumenti e il FAB.

Quando si scorre tenendo premuto sull'immagine (ImageView), il comportamento dell'app funziona perfettamente, mostrando e nascondendo la barra degli strumenti e il FAB. Tuttavia, quando ho il dito sul recyclerview interno per scorrere, il riciclo esterno scorre e l'elenco si sposta su e giù, ma il comportamento di mostrare/nascondere la barra degli strumenti e il FAB non viene mai attivato.

Ho la sensazione che ciò sia dovuto al fatto che il riciclandore interno ha intercettato la pergamena e che la riciclabilità esterna non ha ottenuto l'evento di scorrimento per attivare il comportamento.

Qualcuno sa come assicurarsi che il recyclerview esterno riceva anche l'evento di scorrimento in modo che il comportamento funzioni?

risposta

7

Hank Moody commento in realtà mi ha portato alla risposta corretta - grazie Hank !

Ecco come ho risolto il mio problema:

  1. Creare un 'scorrere' recyclerview in cui il genitore riceverà tutti gli eventi di scorrimento del bambino in questo modo:

    public class ScrollThroughRecyclerView extends RecyclerView { 
        public ScrollThroughRecyclerView(Context context) { 
         super(context); 
        } 
    
        public ScrollThroughRecyclerView(Context context, AttributeSet attrs) { 
         super(context, attrs); 
        } 
    
        public ScrollThroughRecyclerView(Context context, AttributeSet attrs, int defStyle) { 
         super(context, attrs, defStyle); 
        } 
    
        @Override 
        public boolean dispatchTouchEvent(MotionEvent ev){ 
         //true - block scrolling of child and allow scrolling for parent recycler 
         return true; 
        } 
    } 
    
  2. Utilizza questo recyclerview personalizzato nel tuo xml o nel tuo codice java e gli eventi di scorrimento verranno passati correttamente al tuo recyclerview genitore che attiverà il comportamento di scorrimento dell'app.

+1

Esattamente quello di cui ho bisogno. Grazie! – Pablo

0

Hai provato a utilizzare quanto segue nel xml del ricicionamento interno?

app:layout_behavior="@string/appbar_scrolling_view_behavior" 

MODIFICA: presupponendo che si stia utilizzando CoordinatorLayout.

+0

Non sono sicuro che funzionerebbe come, se vedi la demo, ho un'attività con schede in cui ogni scheda mostra un frammento.Il CoordinatorLayout si trova nel layout delle attività xml e non nel file xml del layout dei frammenti, quindi è per questo che il viewpager dell'attività ha l'app: layout_behavior ad esso associato. Nel frammento di layout xml, che contiene il recyclerview esterno e nel layout interno di recyclerview xml, non vi è alcun coordinatorlayout, quindi non credo che l'inserimento di un comportamento in uno dei due avrebbe alcun effetto. – Simon

+0

Hai ragione. colpa mia. – dejavu89

3

se si vuole mettere un riciclatore verticale in un altro verticale è necessario impostare altezza fissa per la vista del bambino riciclatore, o provare a sovrascrivere questo metodo

@Override 
public boolean dispatchTouchEvent(MotionEvent ev){ 
    //false - block scrolling of parent recycler and allow scrolling for child 
    return false; 
} 
+0

Non penso che funzionerebbe come al momento sto provando a passare l'evento scroll al genitore e sto avendo successo mentre il recyclerview esterno sta scorrendo. Tuttavia, il recyclerview interno non attiva il comportamento di scorrimento per nascondere o mostrare la barra degli strumenti/FAB. – Simon

+0

Grazie - questo in realtà mi porta alla risposta corretta che ho postato qui sotto. – Simon

Problemi correlati