IllegalStateException,因为没有调用PagerAdapter上的notifyDataSetChanged()

时间:2014-04-14 14:51:22

标签: android android-viewpager android-pageradapter

我有以下情况,到目前为止找不到解决方案:在Activity A中有一个带有FragmentStatePagerAdapter的ViewPager。从活动A中调用活动B.在那里,您可以更改一些全局数据,这也会影响活动A中ViewPager中的页面数量。因此,一旦我使用后退按钮,返回活动A,我得到以下内容例外:

E/AndroidRuntime(1756): java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 121, found: 151 Pager id: com.example.blablabla:id/main_view_pager Pager class: class android.support.v4.view.ViewPager Problematic adapter: class com.example.blablabla.ActivityMain$MainViewPagerAdapter
E/AndroidRuntime(1756):     at android.support.v4.view.ViewPager.populate(ViewPager.java:962)
E/AndroidRuntime(1756):     at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
...

我试过调用notifyDataSetChanged();在不同位置的适配器上(onCreate,onRestart,onResume,onActivityResult),但没有任何效果。

我尝试的另一件事是每次活动A暂停时将适配器设置为null,然后在恢复活动时重新创建它。这可以避免崩溃,但是1.感觉不对,2。在新活动变得可见之前,页面就会消失,因此看起来不太好。

那么,如何正确处理这种情况呢?

3 个答案:

答案 0 :(得分:3)

根据错误消息,您似乎在之前设置适配器,设置适配器接收的元素。 ([...]Expected adapter item count: 121, found: 151[...]

因此,您应该在更改数据集后调用活动B中的PageAdapter.notifyDataSetChanged();(因为每当发生更改时您都应该调用此方法)。但通过活动传递可能会很麻烦。

此解决方案可能是以下explained by by alvarolb。 alvarob使用setTag()中的instantiateItem()方法创建新视图,使用findViewWithTag()可以检索它。您可能需要查看基于alvarolbs解决方案构建的Grimmace Code Sample

另一个解决方案可能是from rui.araujo删除所有视图并重新创建它们,但这听起来与你所做的完全相同。

答案 1 :(得分:3)

对我来说,在onPause()中的寻呼机适配器上调用getCount()修复了问题:我的pagerAdapter内的数据列表已经改变了它的大小(在我的情况下为0),因此应用程序崩溃了只要它在寻呼机适配器上调用@Override public void onPause() { //since our data might change (for example, in log out the data list is empty) //we need to notify the adapter so it wouldn't cause IllegalStateException if(pagerAdapter != null) { pagerAdapter.notifyDataSetChanged(); } super.onPause(); } 而没有先通知更改:

$rootScope.$digest()

答案 2 :(得分:1)

预期的适配器项目数:121,找到:151

这表示数据指向相同的内存地址,一个更改,另一个(就像您的适配器项目)也更改,因此您应该复制数据备份,一个更改,另一个不会更改。