最近在做竖向切换的ViewPager时遇到了问题。。。
首先这个竖向的ViewPager是参照github上的大神做的,github地址请参考:
接下来说说我遇到的坑吧。
我的项目中使用的是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,这个问题就解决了~ 再次测试代码,问题解决了。

1106

被折叠的 条评论
为什么被折叠?



