2016-06-22 32 views
7

Ho un'attività con la barra degli strumenti comprendente e una vista di scorrimento nidificata con un FrameLayout che inserisco i frammenti in esso. Inizialmente, inserisco un FragmentA con un CardView .RecyclerView all'interno di SwipeRefreshLayout all'interno di NestedScrollViewLayout non può scorrere

Funziona alla grande. Quando faccio clic su un pulsante, tuttavia, sostituisco quello FragmentB con un altro contenente RecyclerView.

Quando aggiungo il FragmentB non riesco a scorrere fino alla fine dell'elenco.

questo video mostra il problema: LINK TO VIDEO

Host Activity Disposizione:

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar" 
    android:layout_width="match_parent" 
    android:layout_height="340dp" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
    android:fitsSystemWindows="true"> 


    <android.support.design.widget.CollapsingToolbarLayout 
     android:id="@+id/collapsing_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_scrollFlags="scroll|exitUntilCollapsed|enterAlwaysCollapsed" 
     android:fitsSystemWindows="true" 
     app:contentScrim="?attr/colorPrimary" 
     app:expandedTitleMarginStart="48dp" 
     app:expandedTitleMarginEnd="64dp"> 

     ......... 
      ...... 
    </android.support.design.widget.CollapsingToolbarLayout> 
</android.support.design.widget.AppBarLayout> 

<android.support.v4.widget.NestedScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="fill_vertical" 
    android:fillViewport="true" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    > 

    <!-- the layout which will be the content of the activity (which will be hosted inside the drawer (NOT the list of the drawer)) --> 
    <FrameLayout 
     android:id="@+id/frame_container" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     > 

    </FrameLayout> 

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

FragmentB Disposizione:

<android.support.v4.widget.SwipeRefreshLayout 
    android:id="@+id/contentView" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 


    <android.support.v7.widget.RecyclerView 
     android:id="@+id/rv_users" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     android:layout_width="match_parent" 

     android:layout_height="wrap_content" /> 

    <include 
     layout="@layout/view_progress" 
     /> 

    <include 
     layout="@layout/view_retry" 
     /> 

    <!--</LinearLayout>--> 

</android.support.v4.widget.SwipeRefreshLayout> 
+0

già una risposta nella prima risposta ... – GensaGames

+0

cambiare l'altezza della vista riciclatore di match_parent – SaravInfern

risposta

5

Hai messo RecyclerView all'interno del 012..
Penso che la soluzione migliore sia avere NestedScrollView o RecyclerView ma non entrambi, perché RecyclerView sta già implementando NestedScrollingChild.

Ho un layout simile nella mia app. Ho fatto lo stesso - metti RecyclerView su FrameLayout e poi su NestedScrollView. È smettere di funzionare correttamente. Senza NestedScrollView tutto funziona correttamente.

+0

problema non è 'RecyclerView con NestedScrollview', ma' SwipeRefreshLayout con NestedScrollview'! 'RecyclerView' e' NestedScrollview' possono funzionare insieme. –

0

penso che questo sia un problema scollinato, customview estende ListView o RecycleView. questo è il mio sol:

public class RewriteListView extends ListView { 


    public RewriteListView(Context context) { 
      super(context); 
    } 


    public RewriteListView(Context context, AttributeSet attrs) { 
      super(context, attrs); 
    } 


    public RewriteListView(Context context, AttributeSet attrs, int defStyle) { 
      super(context, attrs, defStyle); 
    } 


    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
      int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, 
          MeasureSpec.AT_MOST); 
      super.onMeasure(widthMeasureSpec, expandSpec); 
    } 

}

essere felici :)

0

già risposto! Due elementi scorrevoli (come RecycleView e NestedScrollView nella tua domanda) non possono funzionare insieme.

Modifica il layout dell'attività.

<ParentLayout> 

....... 

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar" 
    android:layout_width="match_parent" 
    android:layout_height="340dp" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
    android:fitsSystemWindows="true"> 


    <android.support.design.widget.CollapsingToolbarLayout 
     android:id="@+id/collapsing_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_scrollFlags="scroll|exitUntilCollapsed|enterAlwaysCollapsed" 
     android:fitsSystemWindows="true" 
     app:contentScrim="?attr/colorPrimary" 
     app:expandedTitleMarginStart="48dp" 
     app:expandedTitleMarginEnd="64dp"> 

     ......... 
      ...... 
    </android.support.design.widget.CollapsingToolbarLayout> 
</android.support.design.widget.AppBarLayout> 

//THIS FRAGMENT WILL BE REPLACED! 
<FrameLayout 
     android:id="@+id/frame_container" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     > 

    </FrameLayout> 

....... 
</ParentLayout> 

E che per impostazione predefinita, in prima esecuzione di questa attività - sostituito FrameLayout sopra - al primo frammento con NestedScrollView (È necessario creare nuovo frammento per la sostituzione) e dopo click la sostituzione di frammentare nella sua interrogazione.

+2

Il problema non è 'RecyclerView with NestedScrollview', ma' SwipeRefreshLayout with NestedScrollview'! 'RecyclerView' e' NestedScrollview' possono funzionare insieme. –

0

due cose:

Prima di tutto non c'è bisogno di incorporare il contenitore di frammento in NestedScrollView se si vuole un comportamento di scorrimento nella vostra attività.

Inserire FrameLayout direttamente nel layout di Coordinator con l'attributo layout_behavior al suo interno, quindi inserire semplicemente qualsiasi frammento con Visualizzazione a scorrimento (e non è necessario avere layout_behavior attr).

Quindi nel tuo esempio, si dovrebbe avere a frammenti:

FragmentA che ha disposizione con CardView all'interno NestedScrollView FragmentB con RecyclerView all'interno SwipeRefreshLayout

altro problema è che si mette più di un bambino su SwipeRefreshLayout, e come indicato nella documentazione dovrebbe avere solo un bambino diretto. source