ViewPager加载fragment出现Wrong state class错误的问题

编者:李国帅

qq:9611153 微信lgs9611153

时间:2020/8/2 

背景:

tab导航栏是常见的应用技术,通过点击导航栏或者手势滑动切换显示不同的fragment。

有时还会有一些附带的效果,比如tab字体颜色变化,选中内容居中等。自己实现也不复杂,但是也没必要重复制造轮子,也没有人家专业。我就采用了CommonNavigator+ViewPager+Fragment的方法。

 

问题描述:

应用中遇到了这么个问题,

W/System.err: java.lang.IllegalArgumentException: Wrong state class,

expecting View State but received class android.support.v7.widget.RecyclerView$SavedState instead.

This usually happens when two views of different type have the same id in the same hierarchy.

This view's id is id/xxxxxx. Make sure other views do not use the same id.。

因为在Fragment中使用databinding技术,我也朝这方面想,把界面中使用了其他组件简化清理,进行测试,确实出现了同样的问题。

过程:

开始的时候,在layout inspector中查看,所有的fragment都是在viewpager容器中,再加到同一个layout布局,有点类似listview中的item,这应该不构成问题。

有人说设置mViewPager.setOffscreenPageLimit(3),测试发现设置多少都没用。

又说重载ViewPager的onRestoreInstanceState,可以避免错误,但是根本就没有看见调用。

网上的那些说,不能说有问题,可能是不适合自己遇到的情况。

 

后来,看到有人说要使用懒加载,于是,我在fragment中添加重载函数public void setUserVisibleHint(boolean isVisibleToUser),等待该Fragment的UI 用户是否可见了之后再操作数据。

事实证明确实如此。

总结:

这个问题和viewpager的使用有关。

和fragment是否使用databinding没啥关系,重要的是,必须等待fragment切换完成之后再操作里面的控件。可能和使用viewpager加载的多个fragment中使用相同的resourceid有些关系。

随着程序的变量里面会有很多东西,出现问题各个都会成为怀疑对象。真相是实验出来的,不是猜出来的,坚持实事求是才能找到问题的答案。

 

你可能感兴趣的:(android)