viewpager java.lang.IllegalArgumentException:The observer is null

来源:互联网 发布:java基本语法 编辑:程序博客网 时间:2024/05/29 15:00

最近在做竖向切换的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,这个问题就解决了~ 再次测试代码,问题解决了。

阅读全文
0 0
原创粉丝点击