viewpager 中的 RecyclerView
RecyclerView inside viewpager
我尝试实现如下图所示的布局。
在此布局中,第一个 ViewPager
具有固定高度,第二个 Viewpager
包含 RecyclerView
。
如何将 Viewpager
中的滚动 RecyclerView
连接到父级中的 NestedScrollView
?
我试试这个:
nestedScrollView.isFillViewport = true
但 RecyclerView
从 Viewpager
的顶部开始滚动。
在 XML
中的 RecyclerView 中设置这些行
android:nestedScrollingEnabled="false"
android:height="wrap_content"
我前段时间遇到过这个问题。您希望 RecyclerView
滚动到 NestedScrollView
的位置。 nestedScrollingEnabled
不会帮助你,因为 RecyclerView
在 ViewPager.
里面
解决方案 您可以自定义 ViewPager
以将 ViewPager
的大小调整为从 页面滑动时的当前页面大小。 =24=]
您可以使用以下代码:
public class WrapContentViewPager extends ViewPager {
private int mCurrentPagePosition = 0;
public WrapContentViewPager(Context context) {
super(context);
}
public WrapContentViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
try {
boolean wrapHeight = MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST;
if (wrapHeight) {
View child = getChildAt(mCurrentPagePosition);
if (child != null) {
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = child.getMeasuredHeight();
heightMeasureSpec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
}
}
} catch (Exception e) {
e.printStackTrace();
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public void reMeasureCurrentPage(int position) {
mCurrentPagePosition = position;
requestLayout();
}
}
在xml中声明:
<your.package.name.WrapContentViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</your.package.name.WrapContentViewPager>
之后在页面滑动时调用 reMeasureCurrentpage
函数。
final WrapContentViewPager wrapContentViewPager = (WrapContentViewPager) findViewById(R.id.view_pager);
wrapContentViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
wrapContentViewPager.reMeasureCurrentPage(wrapContentViewPager.getCurrentItem());
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
同时将 android:nestedScrollingEnabled="false"
设置为您的 RecyclerView
。
让你的布局像这样行得通
我尝试实现如下图所示的布局。
在此布局中,第一个 ViewPager
具有固定高度,第二个 Viewpager
包含 RecyclerView
。
如何将 Viewpager
中的滚动 RecyclerView
连接到父级中的 NestedScrollView
?
我试试这个:
nestedScrollView.isFillViewport = true
但 RecyclerView
从 Viewpager
的顶部开始滚动。
在 XML
中的 RecyclerView 中设置这些行android:nestedScrollingEnabled="false"
android:height="wrap_content"
我前段时间遇到过这个问题。您希望 RecyclerView
滚动到 NestedScrollView
的位置。 nestedScrollingEnabled
不会帮助你,因为 RecyclerView
在 ViewPager.
解决方案 您可以自定义 您可以使用以下代码: 在xml中声明: 之后在页面滑动时调用 同时将 ViewPager
以将 ViewPager
的大小调整为从 public class WrapContentViewPager extends ViewPager {
private int mCurrentPagePosition = 0;
public WrapContentViewPager(Context context) {
super(context);
}
public WrapContentViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
try {
boolean wrapHeight = MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST;
if (wrapHeight) {
View child = getChildAt(mCurrentPagePosition);
if (child != null) {
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = child.getMeasuredHeight();
heightMeasureSpec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
}
}
} catch (Exception e) {
e.printStackTrace();
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public void reMeasureCurrentPage(int position) {
mCurrentPagePosition = position;
requestLayout();
}
}
<your.package.name.WrapContentViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</your.package.name.WrapContentViewPager>
reMeasureCurrentpage
函数。 final WrapContentViewPager wrapContentViewPager = (WrapContentViewPager) findViewById(R.id.view_pager);
wrapContentViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
wrapContentViewPager.reMeasureCurrentPage(wrapContentViewPager.getCurrentItem());
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
android:nestedScrollingEnabled="false"
设置为您的 RecyclerView
。
让你的布局像这样行得通