1

好的。我对 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 及其适配器时,我应该知道某种罪魁祸首吗?如何使新适配器与已打开的聊天保持同步?

我已经尝试了很多东西,但似乎没有任何效果......我相信这个问题有一个简单的解决方案。

非常感谢。

4

2 回答 2

0

好的...我最终弄明白了这个。代表我这是一个愚蠢的听众问题。当活动关闭时,我忘记从聊天中取消注册监听器,并且我的 onClosed(Chat) 方法被调用了两次。

于 2013-07-03T12:43:44.547 回答
0

notifyDataSetChanged()在 ADT 22 之后,PagerAdapter在调用 getCount() 之前对调用变得非常严格。所以解决方案就是notifyDataSetChanged()在每次size数据变化时调用适配器。

于 2013-06-19T08:55:25.740 回答