2016-06-22 17 views
18

In un cercapersone vista Ho diversi frammenti, uno dei quali usa uno ScrollView nidificata con un'intestazione e un recyclerview:nidificata ScrollView + recyclerview, strano comportamento autoscroll

<android.support.v4.widget.NestedScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/scrollview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fillViewport="true" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    tools:context="com.m360.android.fragment.Members.MemberDetailsFragment"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:paddingTop="20dp"> 

     <header/> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/recycler" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:clipToPadding="false" 
      android:paddingTop="0dp" /> 

    </LinearLayout> 

</android.support.v4.widget.NestedScrollView> 

Il tag "header" rappresenta un layout complesso che non volevo postare qui poiché estende molto il codice.

quando si passa da una scheda all'altra, scorre verso la vista del riciclatore. L'intestazione è nascosta, devo scorrere verso l'alto per vederlo.

Qualche idea su cosa lo causa? Non voglio usare un tipo nel mio adattatore se posso evitarlo.

risposta

46

Come Harshit detto il Android prevent nested recyclerview from automatically repositioning

è possibile aggiungere questo attributo per il layout lineare. Il layout lineare figlio diretto della tua scrollView.

android:descendantFocusability="blocksDescendants" 

mi ha aiutato.

+1

Disabilita focus.So di childview non è tangibile o cliccabile più ... Qualsiasi suggerimento o alternativa per questo problema? –

+0

No, non è così. Ho usato questa soluzione molte volte, funziona. Forse hai problemi con un altro posto nel tuo codice? – MaxF

+0

No ... Il problema era solo questo. L'ho rimosso e tutto ha funzionato bene. Ho risolto il problema dello scorrimento automatico scrivendo Android: focusableInTouchMode = "true" nel layout principale di Recyclerview. –

13

Abbiamo un problema simile. Abbiamo un verticale RecyclerView. Ogni articolo di questo verticale RecyclerView contiene uno RecyclerView orizzontale, come nell'app Android TV.

Quando abbiamo aggiornato le librerie di supporto da 23.4.0 a 24.0.0 è apparso improvvisamente lo scorrimento automatico. In particolare, quando apriamo un Activity e poi torniamo indietro, il verticale RecyclerView scorre verso l'alto in modo che l'attuale riga orizzontale RecyclerView non venga tagliata e la riga venga visualizzata completamente.

L'aggiunta di android:descendantFocusability="blocksDescendants" risolve il problema.

Tuttavia, ho trovato another solution, che funziona anche. Nel nostro caso il verticale RecyclerView è contenuto in un FrameLayout. Se aggiungo android:focusableInTouchMode="true" a questo FrameLayout, il problema scompare.

C'è anche un third solution mentioned here, che in pratica consiste nel chiamare setFocusable(false) sul figlio/interno RecyclerView s. Non ho provato questo.

A proposito, c'è uno open issue on the AOSP.

+0

Hai optato per la seconda soluzione? perché pensi sia meglio?grazie –

+0

@RenaudFavier Ho optato per l'opzione 'android: descendantFocusability =" blocksDescendants "'. Penso che le 3 soluzioni presentate facciano qualcosa di simile (in pratica impediscono al bambino/interiore "RecyclerView" di guadagnare attenzione, che impedisce lo scorrimento automatico). Tuttavia, [dai uno sguardo a questo] (https://code.google.com/p/android/issues/detail?id=81854#c11) per capire meglio il problema. –

+0

@RenaudFavier Posso usare il trucco 'android: focusableInTouchMode =" true "' per rubare lo stato attivo perché ho il mio 'RecyclerView' esterno racchiuso in un' FrameLayout'. Non sono sicuro che tu possa farlo se il 'RecyclerView' esterno è la radice del tuo layout. –

1

setFocusableInTouchMode=true per il layout del bambino (può essere LinearLayout) di NestedScrollView