13

我有一個UI設計CollapsingToolbarLayout,如下所示。NestedScrolling與NestedScrollView,RecyclerView(水平),在一個CoordinatorLayout

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

    <android.support.design.widget.CollapsingToolbarLayout 

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

     <ImageView 
      android:id="@+id/backdrop" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:fitsSystemWindows="true" 
      android:scaleType="centerCrop" 
      app:layout_collapseMode="parallax" /> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      app:layout_collapseMode="pin" 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> 

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

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

<android.support.v4.widget.NestedScrollView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:fillViewport="true" 
    android:theme="@style/ThemeOverlay.AppCompat.Light" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

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

     <!-- Hiding unrelated code --> 

     <android.support.v7.widget.CardView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_margin="@dimen/card_margin" 
      android:padding="16dp"> 


       <android.support.v7.widget.RecyclerView 
        android:id="@+id/recycler_movie_suggestion" 
        android:layout_width="match_parent" 
        android:layout_height="170dp" 
        android:fillViewport="true" 
        android:nestedScrollingEnabled="false" 
        app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

      </LinearLayout> 

     </android.support.v7.widget.CardView> 

    </LinearLayout> 

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

我的問題是,滾動是好的,只有當我觸摸,滾動OUTSIDE的RecyclerView的區域。如果我嘗試在RecyclerView內垂直滾動,滾動會「陷入」,並且只有NestedScrollView正在滾動,CollaspingToolbarLayout不會縮小。

+0

它認爲這是一個錯誤,nestedScrollingEnabled只能在代碼中完成。在XML中執行它沒有任何影響。 –

回答

34

您需要以編程方式禁用嵌套滾動。如果在xml中完成,它似乎不能正常工作。

recyclerView.setNestedScrollingEnabled(false); 
+1

我應該認爲非工作xml屬性是bug嗎? –

+0

如果我的屏幕很大,可以完全顯示NestedScrollView(或大多數情況下,如果包括CollaspingToolbarLayout的高度,這會在底部進行一些透支),則上述解決方案不起作用。似乎沒有事件發送到CollaspingToolbarLayout使其collasping。 –

+0

我認爲這是真的,即使沒有內部RecyclerView – tachyonflux

2

嘿,如果你有興趣我創建了一個LayoutManager來解決你的問題。

public class ExpansiveLayoutManager extends LinearLayoutManager { 

private int[] mMeasuredDimension = new int[2]; 

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

public ExpansiveLayoutManager(Context context, int orientation, boolean reverseLayout) { 
    super(context, orientation, reverseLayout); 
} 

public ExpansiveLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
    super(context, attrs, defStyleAttr, defStyleRes); 
} 

@Override 
public boolean canScrollVertically() { 
    return false; 
} 

@Override 
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, 
         int widthSpec, int heightSpec) { 
    final int widthMode = View.MeasureSpec.getMode(widthSpec); 
    final int heightMode = View.MeasureSpec.getMode(heightSpec); 
    final int widthSize = View.MeasureSpec.getSize(widthSpec); 
    final int heightSize = View.MeasureSpec.getSize(heightSpec); 

    int width = 0; 
    int height = 0; 
    for (int i = 0; i < getItemCount(); i++) { 
     measureScrapChild(recycler, i, 
       View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED), 
       View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED), 
       mMeasuredDimension); 

     if (getOrientation() == HORIZONTAL) { 
      width = width + mMeasuredDimension[0]; 
      if (i == 0) { 
       height = mMeasuredDimension[1]; 
      } 
     } else { 
      height = height + mMeasuredDimension[1]; 
      if (i == 0) { 
       width = mMeasuredDimension[0]; 
      } 
     } 
    } 
    switch (widthMode) { 
     case View.MeasureSpec.EXACTLY: 
      width = widthSize; 
     case View.MeasureSpec.AT_MOST: 
     case View.MeasureSpec.UNSPECIFIED: 
    } 

    switch (heightMode) { 
     case View.MeasureSpec.EXACTLY: 
      height = heightSize; 
     case View.MeasureSpec.AT_MOST: 
     case View.MeasureSpec.UNSPECIFIED: 
    } 

    setMeasuredDimension(width, height); 
} 

private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec, 
           int heightSpec, int[] measuredDimension) { 
    View view = recycler.getViewForPosition(position); 
    if (view != null) { 
     RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams(); 
     int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec, 
       getPaddingLeft() + getPaddingRight(), p.width); 
     int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec, 
       getPaddingTop() + getPaddingBottom(), p.height); 
     view.measure(childWidthSpec, childHeightSpec); 
     measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin; 
     measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin; 
     recycler.recycleView(view); 
    } 
} 
} 

https://github.com/emanuelet/LayoutManagers/blob/master/ExpansiveLayoutManager.java

0

你不需要把你的recyclerView內NestedScrollView。

<android.support.v7.widget.RecyclerView 
    android:id="@+id/recycler_movie_suggestion" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    android:layout_width="match_parent" 
    android:layout_height="170dp" /> 
3

這是在nestedscrollview內使用recyclerview時最常見的問題。

我已通過將以下行添加到xml中來解決此問題。

<android.support.v7.widget.RecyclerView 
      android:id="@+id/recycler_view_comments" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:nestedScrollingEnabled="false" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 
0

您不必使用NestedScrollView。在那裏離開LinearLayout。

相關問題