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

 sucbenson-lee_905 发布于 2022-11-04 22:49

今天在一个自定义的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;
    }
}

布局如下:

   

        
    

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);
    }
3 个回答
  • mPagerContainer要设置谁的currentIterm。log中打印的确实mViewPager

    2022-11-08 19:48 回答
  • mPagerContainer.setCurrentItem(1);
    

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

    2022-11-08 19:51 回答
  • 唉,傻逼了,自己看了下ViewPager关于setCurrentItem的源码,发现:

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

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

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

    2022-11-08 19:51 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有