好的。我對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及其適配器是否被重新創建?如何讓新適配器與已打開的聊天同步?
我已經嘗試了很多東西,但似乎沒有任何工作......我確信有一個簡單的解決方案來解決這個問題。
非常感謝。
即使我面臨着同樣的問題,是否已經在ADT中修復了22.2.1? – Uday
是的,它也會在adt 22.2.1中工作 –