好的。我对 Android 很陌生,我对 ViewPager 和 FragmentStatePagerAdapter 有疑问。我有一个聊天应用程序,其中聊天显示在 ViewPager 中。聊天可以动态关闭,并且在我导航出我的应用程序并返回聊天活动(并且再次调用活动的 onCreate)之前,这可以完美地工作。
假设我打开了一个聊天窗口。当我离开活动,稍后返回并尝试关闭页面时,我收到此异常:
java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 1, found: 0
这是我的 FragmentStatePagerAdapter:
private class ChatPageAdapter extends FragmentStatePagerAdapter {
private Map<Integer, Fragment> pageReferenceMap = new HashMap<Integer, Fragment>();
private FragmentManager fragmentManager;
public ChatPageAdapter(FragmentManager fm) {
super(fm);
this.fragmentManager = fm;
}
public ChatFragment getItem(int position) {
Fragment fragment = ChatFragment.newInstance(Chat.getChat(position).getUniqueID());
pageReferenceMap.put(position, fragment);
return (ChatFragment) fragment;
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
public int getCount() {
return Chat.getChatCount();
}
public Object instantiateItem(ViewGroup container, int position) {
return super.instantiateItem(container, position);
}
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
pageReferenceMap.remove(position);
}
public ChatFragment getFragment(int position) {
return (ChatFragment) pageReferenceMap.get(position);
}
}
聊天静态存储在 Chat 类中,getChatCount() 只返回 ArrayList 的大小。除了两个地方,我没有在任何地方修改 ArrayList,这两个地方应该与 notifyDataSetChanged() 同步......直到重新创建活动。
在我的 open(Chat) 方法中,我检查 Chat 是否已经“注册”,并仅在尚未“注册”时触发 notifyDataSetChanged(以提高性能)。
在我的 close(Chat) 方法中,我只是从 Chat 类中删除 Chat,在适配器上调用 notifyDataSetChanged,然后 BOOM,抛出异常。
当重新创建 PageViewer 及其适配器时,我应该知道某种罪魁祸首吗?如何使新适配器与已打开的聊天保持同步?
我已经尝试了很多东西,但似乎没有任何效果......我相信这个问题有一个简单的解决方案。
非常感谢。