我有以下情况,到目前为止找不到解决方案:在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。在新活动变得可见之前,页面就会消失,因此看起来不太好。
那么,如何正确处理这种情况呢?
答案 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
这表示数据指向相同的内存地址,一个更改,另一个(就像您的适配器项目)也更改,因此您应该复制数据备份,一个更改,另一个不会更改。