Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ViewPager和删除页面_Android - Fatal编程技术网

Android ViewPager和删除页面

Android ViewPager和删除页面,android,Android,嗯。我是Android新手,我对ViewPager和FragmentStatePagerAdapter有问题。我有一个聊天应用程序,其中聊天记录显示在ViewPager中。聊天可以动态关闭,这项功能非常有效,直到我导航出我的应用程序,返回聊天活动(并且再次调用创建活动) 假设我打开了一个聊天窗口。当我离开活动,稍后返回,并尝试关闭页面时,出现以下异常: java.lang.IllegalStateException: The application's PagerAdapter changed

嗯。我是Android新手,我对ViewPager和FragmentStatePagerAdapter有问题。我有一个聊天应用程序,其中聊天记录显示在ViewPager中。聊天可以动态关闭,这项功能非常有效,直到我导航出我的应用程序,返回聊天活动(并且再次调用创建活动)

假设我打开了一个聊天窗口。当我离开活动,稍后返回,并尝试关闭页面时,出现以下异常:

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中已经解决了这个问题??