我在嵌套的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>