FragmentPagerAdapter
1:簡單的介紹:
該類內的每一個生成的 Fragment 都將保存在內存之中,因此適用於那些相對靜態的頁,數量也比較少的那種;如果需要處理有很多頁,並且數據動態性較大、占用內存較多的情況,應該使用FragmentStatePagerAdapter
2:重寫的幾個方法:
- getItem()
- 該類中新增的一個虛函數。函數的目的為生成新的 Fragment 對象。重載該函數時需要注意這一點。在需要時,該函數將被 instantiateItem() 所調用。
- 如果需要向 Fragment 對象傳遞相對靜態的數據時,我們一般通過 Fragment.setArguments() 來進行,這部分代碼應當放到 getItem()。它們只會在新生成 Fragment 對象時執行一遍。
- 如果需要在生成 Fragment 對象后,將數據集里面一些動態的數據傳遞給該 Fragment,那么,這部分代碼不適合放到 getItem() 中。因為當數據集發生變化時,往往對應的 Fragment 已經生成,如果傳遞數據部分代碼放到了 getItem() 中,這部分代碼將不會被調用。這也是為什么很多人發現調用 PagerAdapter.notifyDataSetChanged() 后,getItem() 沒有被調用的一個原因。
- instantiateItem()
- 函數中判斷一下要生成的 Fragment 是否已經生成過了,如果生成過了,就使用舊的,舊的將被 Fragment.attach();如果沒有,就調用 getItem() 生成一個新的,新的對象將被 FragmentTransation.add()。
- FragmentPagerAdapter 會將所有生成的 Fragment 對象通過 FragmentManager 保存起來備用,以后需要該 Fragment 時,都會從 FragmentManager 讀取,而不會再次調用 getItem() 方法。
- 如果需要在生成 Fragment 對象后,將數據集中的一些數據傳遞給該 Fragment,這部分代碼應該放到這個函數的重載里。在我們繼承的子類中,重載該函數,並調用 FragmentPagerAdapter.instantiateItem() 取得該函數返回 Fragment 對象,然后,我們該 Fragment 對象中對應的方法,將數據傳遞過去,然后返回該對象。
- 否則,如果將這部分傳遞數據的代碼放到 getItem()中,在 PagerAdapter.notifyDataSetChanged() 后,這部分數據設置代碼將不會被調用。
- destroyItem()
- 該函數被調用后,會對 Fragment 進行 FragmentTransaction.detach()。這里不是 remove(),只是 detach(),因此 Fragment 還在 FragmentManager 管理中,Fragment 所占用的資源不會被釋放。
1:簡單的介紹
ragmentStatePagerAdapter 和前面的 FragmentPagerAdapter 一樣,是繼承子 PagerAdapter。但是,和 FragmentPagerAdapter 不一樣的是,正如其類名中的 'State' 所表明的含義一樣,該 PagerAdapter 的實現將只保留當前頁面,當頁面離開視線后,就會被消除,釋放其資源;而在頁面需要顯示時,生成新的頁面(就像 ListView 的實現一樣)。這么實現的好處就是當擁有大量的頁面時,不必在內存中占用大量的內存
2:重寫的幾個方法:
- getItem()
- 一個該類中新增的虛函數。
- 函數的目的為生成新的 Fragment 對象。
- Fragment.setArguments() 這種只會在新建 Fragment 時執行一次的參數傳遞代碼,可以放在這里。
- 由於 FragmentStatePagerAdapter.instantiateItem() 在大多數情況下,都將調用 getItem() 來生成新的對象,因此如果在該函數中放置與數據集相關的 setter 代碼,基本上都可以在 instantiateItem() 被調用時執行,但這和設計意圖不符。畢竟還有部分可能是不會調用 getItem() 的。因此這部分代碼應該放到 instantiateItem() 中。
- instantiateItem()
- 除非碰到 FragmentManager 剛好從 SavedState 中恢復了對應的 Fragment 的情況外,該函數將會調用 getItem() 函數,生成新的 Fragment 對象。新的對象將被 FragmentTransaction.add()。
- FragmentStatePagerAdapter 就是通過這種方式,每次都創建一個新的 Fragment,而在不用后就立刻釋放其資源,來達到節省內存占用的目的的。
- destroyItem()
- 將 Fragment 移除,即調用 FragmentTransaction.remove(),並釋放其資源。
- instantiateItem()
- 函數中判斷一下要生成的 Fragment 是否已經生成過了,如果生成過了,就使用舊的,舊的將被 Fragment.attach();如果沒有,就調用 getItem() 生成一個新的,新的對象將被 FragmentTransation.add()。
- FragmentPagerAdapter 會將所有生成的 Fragment 對象通過 FragmentManager 保存起來備用,以后需要該 Fragment 時,都會從 FragmentManager 讀取,而不會再次調用 getItem() 方法。
- 如果需要在生成 Fragment 對象后,將數據集中的一些數據傳遞給該 Fragment,這部分代碼應該放到這個函數的重載里。在我們繼承的子類中,重載該函數,並調用 FragmentPagerAdapter.instantiateItem() 取得該函數返回 Fragment 對象,然后,我們該 Fragment 對象中對應的方法,將數據傳遞過去,然后返回該對象。
- 否則,如果將這部分傳遞數據的代碼放到 getItem()中,在 PagerAdapter.notifyDataSetChanged() 后,這部分數據設置代碼將不會被調用。
- destroyItem()
- 該函數被調用后,會對 Fragment 進行 FragmentTransaction.detach()。這里不是 remove(),只是 detach(),因此 Fragment 還在 FragmentManager 管理中,Fragment 所占用的資源不會被釋放。
