Viewpager内滚动视图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Viewpager内滚动视图相关的知识,希望对你有一定的参考价值。

我有一个ViewPager里面一个ScrollView以及其他成分。当我给一个高度ViewPagerXML那么ScrollView工作正常,但我不能给高度ScrollView作为ViewPager应根据页面高度扩张。我实现了一个可运行的,这将扩大在运行时ViewPager

问题是我不能滚动,其持有的ScrollViewViewPager

XML =======

<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
  <ImageView
    android:src="@drawable/img1"
    android:scaleType="fitXY"
    android:layout_width="match_parent"
    android:layout_height="150dp"
    android:id="@+id/img_1"
    />
<ViewPager
    android:layout_width="match_parent"
    android:layout_height="wrap_content">        
</ViewPager>
</ScrollView>

JAVA动态设置为viewpager高度

viewpager.post(new Runnable() {
@Override
public void run() {
    ViewGroup.LayoutParams lp = viewpager.getLayoutParams();
    lp.height = viewpager.getChildAt(viewpager.getCurrentItem()).getHeight();
    viewpager.setLayoutParams(lp);
}

});

答案

我想你必须删除你的Java代码。但添加此属性,您的滚动型的xml:

android:fillViewport="true"
另一答案

这个问题是在这里找到答案:Dynamic height viewpager

无论如何,我想给你,你需要解决它的代码:

public class CustomPager extends ViewPager {

    private View mCurrentView;

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

    public CustomPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (mCurrentView == null) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            return;
        }
        int height = 0;
        mCurrentView.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        int h = mCurrentView.getMeasuredHeight();
        if (h > height) height = h;
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    public void measureCurrentView(View currentView) {
        mCurrentView = currentView;
        requestLayout();
    }

    public int measureFragment(View view) {
        if (view == null)
            return 0;

        view.measure(0, 0);
        return view.getMeasuredHeight();
    }
}

像老板的回答说:

ViewPager需要在每个页面被改变时重新测量。好的地方做,这是PagerAdapter的setPrimaryItem功能

public class MyPagerAdapter extends FragmentPagerAdapter {

    private List<Fragment> fragments;
    private int mCurrentPosition = -1;

    public MyPagerAdapter(FragmentManager fm) {
        super(fm);
        this.fragments = new ArrayList<Fragment>();
        fragments.add(new FirstFragment());
        fragments.add(new SecondFragment());
        fragments.add(new ThirdFragment());
        fragments.add(new FourthFragment());
    }

    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        super.setPrimaryItem(container, position, object);
        if (position != mCurrentPosition) {
            Fragment fragment = (Fragment) object;
            CustomPager pager = (CustomPager) container;
            if (fragment != null && fragment.getView() != null) {
                mCurrentPosition = position;
                pager.measureCurrentView(fragment.getView());
            }
        }
    }

    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

    @Override
    public int getCount() {
        return fragments.size();
    }
}

你可以找到所有代码here

另一答案

我找到很好的解决办法here

无论如何,这是文章的代码:

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        try {
            int currentPagePosition=0;
            View child = getChildAt(currentPagePosition);
            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);
    }

您需要创建自己的自定义视图寻呼机从ViewPager延伸和覆盖onMeasure方法

以上是关于Viewpager内滚动视图的主要内容,如果未能解决你的问题,请参考以下文章

ViewPager 中片段内的 ScrollView 内的 Horizo​​ntalListView

Android使用片段在viewpager中的页面滚动上放置动画

ViewPager中的视图在ScrollView中不能垂直滚动

在 CoordinatorLayout Android 中的 ViewPager 片段中使用 NestedScrollView 突然滚动

Viewpager内滚动视图

ViewPager里面的ScrollView,自动滚动到中间