Android ViewPager和删除页面
嗯。我是Android新手,我对ViewPager和FragmentStatePagerAdapter有问题。我有一个聊天应用程序,其中聊天记录显示在ViewPager中。聊天可以动态关闭,这项功能非常有效,直到我导航出我的应用程序,返回聊天活动(并且再次调用创建活动) 假设我打开了一个聊天窗口。当我离开活动,稍后返回,并尝试关闭页面时,出现以下异常:Android ViewPager和删除页面,android,Android,嗯。我是Android新手,我对ViewPager和FragmentStatePagerAdapter有问题。我有一个聊天应用程序,其中聊天记录显示在ViewPager中。聊天可以动态关闭,这项功能非常有效,直到我导航出我的应用程序,返回聊天活动(并且再次调用创建活动) 假设我打开了一个聊天窗口。当我离开活动,稍后返回,并尝试关闭页面时,出现以下异常: java.lang.IllegalStateException: The application's PagerAdapter changed
java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 1, found: 0
这是我的碎纸机:
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);
}
}
私有类ChatPageAdapter扩展了FragmentStatePagerAdapter{
私有映射pageReferenceMap=newHashMap();
私人碎片管理器碎片管理器;
公共聊天页面适配器(FragmentManager fm){
超级(fm);
this.fragmentManager=fm;
}
公共项目(内部位置){
Fragment Fragment=ChatFragment.newInstance(Chat.getChat(position.getUniqueID());
pageReferenceMap.put(位置、片段);
返回(片段)片段;
}
@凌驾
public int getItemPosition(对象){
返回位置\无;
}
public int getCount(){
返回Chat.getChatCount();
}
公共对象实例化项(视图组容器,int位置){
返回超级实例化项(容器、位置);
}
公共项(视图组容器、int位置、对象){
超级项目(容器、位置、对象);
pageReferenceMap.remove(位置);
}
公共聊天片段getFragment(int位置){
return(ChatFragment)pageReferenceMap.get(position);
}
}
聊天记录静态存储在Chat类中,getChatCount()只返回ArrayList的大小。我只在两个地方修改ArrayList,这两个地方应该与notifyDataSetChanged()同步。。。直到重新创建活动为止
在我的open(Chat)方法中,我检查聊天是否已经“注册”,只有在没有注册时才触发notifyDataSetChange(以提高性能)
在我的close(Chat)方法中,我只需从Chat类中删除Chat,在适配器上调用notifyDataSetChanged,然后抛出异常
当重新创建PageViewer及其适配器时,有什么罪魁祸首我应该知道吗?如何使新适配器与已打开的聊天保持同步
我尝试了很多东西,但似乎都不管用。。。我相信这个问题有一个简单的解决办法
非常感谢。在ADT 22之后,PagerAdapter在调用getCount()之前对调用
notifyDataSetChanged()
非常严格。
因此,解决方案只是在每次数据的
大小更改时,在适配器上调用notifyDataSetChanged()
。确定。。。我终于弄明白了。这对我来说是个愚蠢的听众问题。当活动关闭时,我忘记从聊天中注销侦听器,我的onClosed(chat)方法被调用了两次。即使我也面临同样的问题,ADT 22.2.1中已经解决了这个问题??