嵌套ViewPager,调用其setCurrentItem方法失效

发布于 2022-09-01 23:56:41 字数 3685 浏览 21 评论 0

今天在一个自定义的ViewGroup中嵌套了ViewPager,为了能显示ViewPager前后两页的内容,但是发现使用过程中,ViewPager的setCurrentItem无效了,始终都是从第0页开始显示,求大侠指导。

自定义ViewGroup代码如下:

public class PagerContainer extends FrameLayout implements ViewPager.OnPageChangeListener {
    private ViewPager mViewPager;
    private boolean mNeedsRedraw = false;

    private Point mCenter = new Point();
    private Point mInitialTouch = new Point();

    public PagerContainer(Context context) {
        this(context, null);
    }

    public PagerContainer(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public PagerContainer(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initData();
    }

    private void initData() {
        // 允许子View在其区域内进行绘制
        setClipChildren(false);

        // child clip功能在Android3.x之后的版本会因为硬件加速而不起作用,所以这里需要关闭硬件加速功能
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        try {
            mViewPager = (ViewPager) getChildAt(0);
            mViewPager.setOnPageChangeListener(this);
        } catch (Exception e) {
            throw new IllegalStateException("The root child of PagerContainer must be a ViewPager");
        }
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        mCenter.x = w / 2;
        mCenter.y = h / 2;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mInitialTouch.x = (int) event.getX();
                mInitialTouch.y = (int) event.getY();
            default:
                event.offsetLocation(mCenter.x - mInitialTouch.x, mCenter.y - mInitialTouch.y);
                break;
        }

        return mViewPager.dispatchTouchEvent(event);
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        if (mNeedsRedraw) invalidate();
    }

    @Override
    public void onPageSelected(int position) {

    }

    @Override
    public void onPageScrollStateChanged(int state) {
        mNeedsRedraw = (state != ViewPager.SCROLL_STATE_IDLE);
    }

    public ViewPager getViewPager() {
        return mViewPager;
    }
}

布局如下:

   <com.yunos.ui.widget.PagerContainer
        android:id="@+id/pager_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#000000">

        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager_layout"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:layout_gravity="center_horizontal"/>
    </com.yunos.ui.widget.PagerContainer>

MainActivity初始化代码:

    private void initView() {
        mPagerContainer = (PagerContainer) findViewById(R.id.pager_container);
        mViewPager = mPagerContainer.getViewPager();
        Log.e(TAG, "get viewpager current item=" + mViewPager.getCurrentItem());
        // 如下方法失效,求指导
        mViewPager.setCurrentItem(1);
        Log.e(TAG, "get viewpager current item=" + mViewPager.getCurrentItem());
        mViewPager.setOffscreenPageLimit(AppPageAdapter.NUM_ITEMS);
        mViewPager.setClipChildren(true);
        mViewPager.setPageMargin(15);
        mFragmentPagerAdapter = new AppPageAdapter(getSupportFragmentManager());
        mViewPager.setAdapter(mFragmentPagerAdapter);
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

南七夏 2022-09-08 23:56:41

唉,傻逼了,自己看了下ViewPager关于setCurrentItem的源码,发现:

        if (mAdapter == null || mAdapter.getCount() <= 0) {
            setScrollingCacheEnabled(false);
            return;
        }

应该在setAdapter之后再调用setCurrentItem,这种傻逼错误都犯了,对自己无语了。

问题就不删了,给大家也一个警告吧,防止范类似的错误!

风渺 2022-09-08 23:56:41
mPagerContainer.setCurrentItem(1);

这是一行错误代码,container并没有setCurrentItem方法,应该是mViewPager.setCurrentItem(1);
setCurrentItem要在setAdapter之后。

奈何桥上唱咆哮 2022-09-08 23:56:41

mPagerContainer要设置谁的currentIterm。log中打印的确实mViewPager

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文