我在嵌套的Scrollview中使用带有NestedScrollView和Viewpager的Collapsing ToolBar Layout.
我有3个标签,这些标签有3个片段.这些片段使用RecyclerView来设置数据.
现在使用nestedScrollView和viewpager,当我滚动RecyclerView内容时,折叠效果不起作用.
我还需要放置NestedScrollView,因为我需要在Tabs上面显示一些信息.
这是我的代码:
<android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" 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" android:fitsSystemWindows="true" app:contentScrim="?attr/colorPrimary" app:expandedTitleMarginEnd="64dp" app:expandedTitleMarginStart="48dp" app:expandedTitleTextAppearance="@style/TransparentText"> <FrameLayout android:id="@+id/carouselLayout" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_scrollFlags="scroll|exitUntilCollapsed" android:fitsSystemWindows="true" app:layout_collapseMode="parallax"> <ImageView android:id="@+id/coverImage" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/example" android:scaleType="centerCrop"/> <LinearLayout android:layout_width="match_parent" android:gravity="bottom" android:orientation="vertical" android:layout_gravity="bottom" android:padding="@dimen/profile_image_margin" android:background="@drawable/gradient_bg" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:layout_height="wrap_content"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/profile_image_margin" android:textSize="@dimen/text_size_xlarge" android:textStyle="bold" android:textColor="@color/white" android:text="Title" android:id="@+id/content_title"/> </LinearLayout> </FrameLayout> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:theme="@style/ActionBarThemeOverlay" app:popupTheme="@style/ActionBarPopupThemeOverlay" app:layout_scrollFlags="scroll|enterAlways" android:background="@drawable/gradient_bg" /> </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" android:isScrollContainer="true" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="sdjsfksdfsd" android:textColor="@color/red"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="csdffsfsdfsdfsdf" android:textColor="@color/red"/> <android.support.design.widget.TabLayout android:id="@+id/slidingTabs" android:layout_width="match_parent" app:tabMode="scrollable" app:tabGravity="fill" android:layout_height="wrap_content"/> <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:layout_height="300dp"> </android.support.v4.view.ViewPager> </LinearLayout> </android.support.v4.widget.NestedScrollView>
如果你有任何想法如何在android中的NestedScrollview中实现Recyclerview,请帮助我,这样我就可以使用了.
解决方法
看来这已经在这里得到了回答:
https://stackoverflow.com/a/31561790/4931825
https://stackoverflow.com/a/31561790/4931825
您还可以查看上述答案中提供的此示例
https://github.com/TheLittleNaruto/SupportDesignExample/
作者创建了一个自定义的NestedScrollView类,扩展了NestedScrollView,它覆盖了onInterceptTouchEvent方法,如下所示:
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { final float x = ev.getX(); final float y = ev.getY(); switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: xDistance = yDistance = 0f; lastX = ev.getX(); lastY = ev.getY(); break; case MotionEvent.ACTION_MOVE: final float curX = ev.getX(); final float curY = ev.getY(); xDistance += Math.abs(curX - lastX); yDistance += Math.abs(curY - lastY); lastX = curX; lastY = curY; if (xDistance > yDistance) return false; } return super.onInterceptTouchEvent(ev) || ev.getPointerCount() == 2; }
和一个扩展ViewPager的自定义ViewPager类,它覆盖了它的onMeasure方法,如下所示:
@Override protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) { super.onMeasure(widthMeasureSpec,heightMeasureSpec); int height = 0; for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); child.measure(widthMeasureSpec,MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED)); int h = child.getMeasuredHeight(); if (h > height) height = h; } heightMeasureSpec = MeasureSpec.makeMeasureSpec(height,MeasureSpec.EXACTLY); super.onMeasure(widthMeasureSpec,heightMeasureSpec); }
最后,他在CoordinatorLayout中使用了两个:
<com.thelittlenaruto.supportdesignexample.customview.MyNestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <LinearLayout android:id="@+id/lin" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:visibility="visible"> <com.thelittlenaruto.supportdesignexample.customview.WrapContentHeightViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </com.thelittlenaruto.supportdesignexample.customview.MyNestedScrollView>