2016-03-31 10 views
5

Sto tentando di implementare un comportamento simile a ViewPager per un RecyclerView orizzontale. I dati dall'adattatore dovrebbero gonfiarsi e legarsi normalmente, ma la navigazione attraverso Recycler deve essere gestita in modo diverso. Quando l'utente fa scorrere (o tenta di scorrere), sposto lo Recycler un elemento in quella direzione, incollandolo sul lato sinistro.Comportamento simile a cercapersone in RecyclerView

Ho già tutta la logica di transizione dell'articolo. Sto utilizzando un numero personalizzato LayoutManager, che sostituisce onSmoothScrollToPosition() con un valore personalizzato LinearSmoothScroller() che fa rimanere l'elemento nella sinistra.

La domanda è: come posso ignorare il comportamento di scorrimento dello RecyclerView per intercettare gli swip e gestirli da solo? Ho provato a disabilitare lo scorrimento nel LayoutManager e quindi a intercettare il gesto in un onTouchListener, ma questo non sembra funzionare. Il framework RecyclerView ha un modo pulito per gestirlo?

+0

Penso che intercettando il gesto in 'onTouchListener' dovrebbe già fare il trucco. Cosa non funziona su quella soluzione? – EpicPandaForce

+0

Beh, non intercetta nulla per qualche motivo. Presumo che ciò possa essere causato dal fatto che il Recycler orizzontale si trova in una pagina di un pager più grande (Fragment Pager per sezioni dell'app) e passa semplicemente il gesto al cercapersone superiore :( – Kelevandos

+0

@EpicPandaForce Sono riuscito a ottenerlo risulta che ho dovuto implementare onScroll() in SimpleGestureListener, non solo onFling(). Tuttavia, c'è un problema anche con questo: il metodo onScroll() si innesca più volte, con il Recycler che attraversa tutto articoli per gestirlo? – Kelevandos

risposta

0

Impostare le s' LayoutManager a

final StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.HORIZONTAL); mRecyclerView.setLayoutManager(layoutManager);

+0

E come può essere d'aiuto? – Kelevandos

+0

@Kelevandos usa lo scrollview personalizzato per rilevare YScroll. [riferimento] (http: // stackoverflow.it/questions/2646028/android-horizontalscrollview-within-scrollview-touch-handling) – Aks4125

+0

Intendi un wrapper ScrollView per RecyclerView? Questo potrebbe funzionare, ma spero che ci sia un modo per gestire questo in modo pulito usando il framework RecyclerView :-( – Kelevandos

2

c'è una biblioteca layoutmanagers proprio per questo RecyclerView.

quello di cui avete bisogno è ViewPagerLayoutManager. Si basa sulla stessa idea che hai già ma più estesa e gestisce più casi. In pratica scorre fino a quando non si verifica una modifica dello stato della pagina &, quindi subentra e si adatta alla pagina giusta.

Per utilizzarlo è sufficiente impostare come un normale gestore di layout:

recyclerView.setLayoutManager(new ViewPagerLayoutManager(getActivity())); 

per ulteriori informazioni ed esempi controllare here

+0

Funziona, ma costringe il riciclatore a funzionare al 100% come un cercapersone, ovvero un bambino visibile alla volta. Questo non è quello che voglio :-( – Kelevandos

+0

puoi semplicemente usarne un altro se vuoi vedere o scorrere più volte elementi ad esempio SnapperLinearLayoutManager – djodjo

+1

funziona perfettamente –

1

La soluzione nativa Android coperto di this posta era un modo super facile per fare in modo che RecyclerView si comporti come un ViewPager.

bit rilevanti:

La versione 24.2.0 della libreria di supporto introdotti due nuovi classi (SnapHelper e LinearSnapHelper) che devono essere utilizzate per gestire rompersi in una RecyclerView. .... l'unico codice necessario è:

SnapHelper snapHelper = new LinearSnapHelper(); snapHelper.attachToRecyclerView(recyclerView);

SnapHelper snapHelper = new GravitySnapHelper(Gravity.START); snapHelper.attachToRecyclerView(startRecyclerView);

+1

Nella risposta, includere la parte pertinente della pagina collegata. Una risposta di solo collegamento non è di facile utilizzo e diventa totalmente inutile se il collegamento muore! – Benjamin