2013-06-19 64 views
1

好的。我對Android非常陌生,並且對ViewPager和FragmentStatePagerAdapter有問題。我有一個聊天應用程序,其中聊天顯示在ViewPager中。聊天可以動態關閉,並且這個工作完美直到我導航出我的應用程序,並返回到聊天活動(並再次調用活動的onCreate)。ViewPager並刪除頁面

比方說,我有一個聊天窗口打開。當我離開活動,稍後返回,並試圖關閉網頁,我得到這個異常:

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); 
    } 
} 

的聊天記錄都存儲靜態地在聊天類,而getChatCount()只是返回ArrayList的大小。我不是在任何地方修改ArrayList,而是在兩個地方,這兩個地方應該與notifyDataSetChanged()同步...直到重新創建活動。

在我的打開(聊天)方法中,我檢查聊天是否已經「註冊」,並且只有在沒有時才觸發notifyDataSetChanged(以提高性能)。

在我的close(聊天)方法中,我只是從聊天類中刪除Chat,在適配器上調用notifyDataSetChanged,然後BOOM引發異常。

是否有一些罪魁禍首,我應該知道PageViewer及其適配器是否被重新創建?如何讓新適配器與已打開的聊天同步?

我已經嘗試了很多東西,但似乎沒有任何工作......我確信有一個簡單的解決方案來解決這個問題。

非常感謝。

回答

0

好的......我得到了這個最終想通了。這代表了我的一個愚蠢的傾聽者問題。當活動關閉時,我忘記從聊天中註銷聽衆,並且我的onClosed(聊天)方法被調用了兩次。

0

在ADT 22之後,PagerAdapter在調用getCount()之前調用notifyDataSetChanged()已經非常嚴格。 因此,每當數據更改size時,解決方案只需在適配器上調用notifyDataSetChanged()即可。

+0

即使我面臨着同樣的問題,是否已經在ADT中修復了22.2.1? – Uday

+0

是的,它也會在adt 22.2.1中工作 –