ViewPager中的RecyclerView [英] RecyclerView inside viewpager
问题描述
我尝试实现下图所示的布局.
I try to implement a layout like below image.
在此布局中,第一个ViewPager
具有固定高度,第二个Viewpager
包含RecyclerView
.
in this layout first ViewPager
has fix height and second Viewpager
contain RecyclerView
.
如何将Viewpager
中的滚动RecyclerView
连接到父级中的NestedScrollView
?
How can connect scroll RecyclerView
in Viewpager
to NestedScrollView
in parent?
我尝试这样:
nestedScrollView.isFillViewport = true
,但RecyclerView
从Viewpager
的顶部滚动.
I try this:
nestedScrollView.isFillViewport = true
but RecyclerView
scroll from top of Viewpager
.
推荐答案
我前一段时间已经遇到了这个问题.您要RecyclerView
滚动NestedScrollView
的位置.并且nestedScrollingEnabled
不会帮助您,因为RecyclerView
位于ViewPager.
I have faced this issue some time ago. Where you want RecyclerView
to be Scrolled by NestedScrollView
. And nestedScrollingEnabled
will not help you because RecyclerView
is inside ViewPager.
解决方案,您可以自定义ViewPager
以将ViewPager
调整为当前页面大小,方法是从
Solution You can customize the ViewPager
to resize the ViewPager
to it's current page size on page swipe from this answer.
您可以使用以下代码:
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
函数.
After that call reMeasureCurrentpage
function on page swipe.
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中的RecyclerView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!