ViewPager异步添加数据异常 The application’s PagerAdapter changed the adapter’s contents without calling Pag

  • Post author:
  • Post category:其他


项目中用到ViewPager左右滑动图片,图片从网上获取,异步添加到ViewPager的Adapter中。出现强关,log如下

06-25 15:01:44.396 E/AndroidRuntime(21181): java.lang.IllegalStateException: The application’s PagerAdapter changed the adapter’s contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 6, found: 7 Pager id: com.fineos.music:id/focus_pager Pager class: class android.support.v4.view.ViewPager Problematic adapter: class com.fineos.music.HQadapter.OnlineFocusFragmentPagerAdapter

06-25 15:01:44.396 E/AndroidRuntime(21181):


at android.support.v4.view.ViewPager.populate(ViewPager.java:962)

06-25 15:01:44.396 E/AndroidRuntime(21181):


at android.support.v4.view.ViewPager.populate(ViewPager.java:914)

06-25 15:01:44.396 E/AndroidRuntime(21181):


at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436)

06-25 15:01:44.396 E/AndroidRuntime(21181):


at android.view.View.measure(View.java:15623)

在描述问题解决之前,先说下项目列表显示的机制吧

1、数据:

1)、Adapter接受到的是List,List容器中存放的是数据的实体类

2)、所有View存放在Map中,getCount()方法返回的是Map的size

2、视图:

1)、Adapter首先会根据List的大小和展现的View,预加载,这里是每次下载48条数据,每页12条,共4页

2)、当ViewPager的滚动状态为IDLE的情况下,会以当前页为基准,向前创建一页View,向后创建两页View

3)、所有View保存在Map中,当在调用instantiateItem方法的时候,直接从Map里边取

3、更新:

1)、当数据下载完成,在主线程更改适配器中的List容器,并且调用notifyDataSetChanged();

2)、onPageSelected触发会再次预加载的下一页数据,更新完毕还会执行上一步

好,进入正文

很多帖子提到ADT更新到22之后,检查更加严格,因此,每次数据更改都要调用notifyDataSetChanged方法,

我确实是这么做了,异步下载数据,下载完数据发送到主线程进行notifyDataSetChanged,结果,还是抛异常。

之前没看过ViewPager源码,这次就大概跟踪下方法吧!

通过搜索ViewPager类,找到异常抛出位置,在populate方法中



版权声明:本文为hlglinglong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。