2012-04-05 84 views
9

我們正在嘗試創建一個基於ViewPager的Android應用程序,該應用程序在運行時接收添加和刪除頁面的指令。幾乎就像標籤式瀏覽器體驗一樣,您可以刪除當前標籤或刪除特定標籤。在ViewPager和FragmentStatePagerAdapter上銷燬頁面

繼Google文檔之後,我們使用了FragmentStatePagerAdapter,該工具旨在用於存在大量頁面時更像列表視圖的情況。

但是,當我們嘗試: - 刪除頁面不在屏幕 上 - 創造同一類 一個新片段的對象 - 和刪除 頁面的相同位置,我們注意到了Android平臺恢復死網頁並將其顯示給用戶。我們剛剛創建的新對象不會運行「onCreate」,「onCreateView」或「onActivityCreated」。

我們正在尋找解決此問題的方法,迫使平臺使用來自同一類的新片段對象。有任何想法嗎?

我們發現,如果我們銷燬當前頁面,平臺確實銷燬了頁面,並從同一個類創建了一個新對象。這是一個複製問題和這種行爲的小例子。

來源:http://dl.dropbox.com/u/8333012/SimpleAdapter/SimplePager.zip

視頻:http://www.youtube.com/watch?v=-oaXXwU8PSI&hd=1

從當你觸摸TextView的第一頁它的目的是刪除第二個頁面(這是綠色)到一個新的藍色頁面上這個項目。你會看到,即使從第一頁開始,第二頁仍保持綠色。但是當你按下第二頁上的返回Android按鈕(綠色)並觸摸TextView時,第二頁創建的將是正確的藍色。

回答

13

當您處理ListView並更改適配器的底層數據時,您可以撥打notifyDataSetChanged(),任何反映該數據集的視圖都將自行刷新。這就是你應該使用片段尋呼機適配器的方式。

在你的情況下,你不通知適配器。但是,在FragmentPagerAdapter/FragmentStatePagerAdapter的情況下,它沒有區別,因爲那些適配器默認情況下忽略notifyDataSetChanged()。要使其工作在你的適配器實現

@Override 
public int getItemPosition(Object object) { 
    return POSITION_NONE; 
} 

而作爲覆蓋getItemPosition()已經說了,你加入後/刪除片段致電(在你的showOtherPage()

mAdapter.notifyDataSetChanged(); 
+1

謝謝你,但作爲一個副作用性能改變頁面大大減少。 2秒鐘即可更改Galaxy Tab 10'1(Google I/O事件)中的頁面。在你的建議之前它是瞬間的。 – 2012-04-09 11:47:37

+0

謝謝,你節省了我的時間! – ihrupin 2013-03-11 23:08:43