viewpager java.lang.IllegalArgumentException:The observer is null

最近在做竖向切换的ViewPager时遇到了问题。。。

首先这个竖向的ViewPager是参照github上的大神做的,github地址请参考:

https://github.com/simplezhli/ChangeTabLayout

接下来说说我遇到的坑吧。
我的项目中使用的是MVP架构的fragment,这个VerticalViewPager就在其中的一个fragment中。由于使用了MVP架构,界面的显示只是一个view,加载在同一个fragment上,所以整个工程中只有一个BaseFragment。

首次打开该fragment的时候,界面显示没有问题。然后在退出该fragment时没有销毁该fragment,只是将该fragment上ViewHandler隐藏,对应的ViewHandler中的代码如下:

    @Override
    public void onHiddenChanged(boolean hidden) {
        if (!hidden) {
            initData();
        } else {
            mVerticalViewPager.removeAllViews();
        }
    }

    /**
     * 初始化界面参数
     */
    private void initData() {
        mExamId = mActivity.getIntent().getStringExtra(ConstValue.EXAM_RECORD_ID);
        mReportPresenter = new ReportPresenter(this, mActivity);
        mVerticalViewPager.post(new Runnable() {
            @Override
            public void run() {
                mReportPresenter.getFileInfo(mExamId);
            }
        });
        onSetProgressBarVisibility(View.VISIBLE);
    }
....

    @Override
    public void showWaveView(List<View> waveViews) {
        mWaveViewList = waveViews;
        ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(mWaveViewList);
        mVerticalViewPager.setAdapter(viewPagerAdapter);
    }

BaseFragment中的代码:

 @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        if (null != mViewHandler) {
            mViewHandler.onHiddenChanged(hidden);
            mViewHandler.setHidden(hidden);
        }
    }

再次打开界面时,问题出现了:

Caused by:
  java.lang.IllegalArgumentException:The observer is null.
  android.database.Observable.registerObserver(Observable.java:45)
  android.support.v4.view.PagerAdapter.registerDataSetObserver(PagerAdapter.java:296)
  rkhy.com.ecg.view.VerticalViewPager.setAdapter(VerticalViewPager.java:477)
  rkhy.com.ecg.fragment.mvp.view.impl.ReportViewHandler.showWaveView(ReportViewHandler.java:146)

从bug描述中可知,是在setAdapter时报错,查找VerticalViewPager对应的代码如下:

这里写图片描述

在看下自定义的Adapter中没有重写这个RegisterDataSetObserver,那看PagerAdapter中的这个方法:

    /**
     * Register an observer to receive callbacks related to the adapter's data changing.
     *
     * @param observer The {@link android.database.DataSetObserver} which will receive callbacks.
     */
    public void registerDataSetObserver(DataSetObserver observer) {
        mObservable.registerObserver(observer);
    }

可以看出,PagerAdapter中对于视图的更新使用的是观察者模式,在这里注册观察者。而在我自定义的VerticalViewPager中,由于第二次进入时,mAdapter不为空,所以执行了销毁之前视图的操作,但是在操作之前首先将观察者注册为null,这就导致该问题的发生。

解决方法:
1. 自定义的VerticalViewPager,在销毁之前的视图之前,不再将观察者注册为null;

这里写图片描述
2. 在自定义的Adapter中,重写registerDataSetObserver方法,并增加是否为null的判断:

    @Override
    public void registerDataSetObserver(DataSetObserver observer) {
        if (null != observer) {
            super.registerDataSetObserver(observer);
        }
    }

OK,这个问题就解决了~ 再次测试代码,问题解决了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值