viewpager 里面的 fragment 數(shù)據(jù)加載和頁面展示

在滑出屏幕時(shí) view會被銷毀
比如有6個(gè)fragments
先到 fragment 1
跳到 fragment 6
此時(shí)fragment 1的view就會被銷了

然鵝....
fragment對象是保留的 在內(nèi)存中 沒有被銷毀fragment中的數(shù)據(jù)也是保留的

這就是一個(gè)問題
view被銷毀了 而數(shù)據(jù)還在

如果下次展示頁面的時(shí)候 不想重復(fù)請求數(shù)據(jù)了

那就恢復(fù)一下
view
view和數(shù)據(jù)的綁定關(guān)系
就可以了

展示頁面和加載數(shù)據(jù)的邏輯

~~ boolean mIsVisibleToUser; // 頁面是否可見
~~ boolean mIsViewCreated; // 頁面的view是否加載
~~ boolean mHasDataLoaded; // 數(shù)據(jù)是否加載
~~
~~ public void getData() {
~~ // 得到數(shù)據(jù)
~~ if (mHasDataLoaded) {
~~ restoreDataAndView();
~~ } else {
~~ mHasDataLoaded = true;
~~ initData();
~~ }
~~ }
~~
~~ void restoreDataAndView() {
~~ // 恢復(fù)view和數(shù)據(jù)的綁定關(guān)系
~~ }
~~
~~ void initData() {
~~ // 初始化數(shù)據(jù) 從本地取 從網(wǎng)絡(luò)取
~~ }
~~
~~ @Override
~~ public void setUserVisibleHint(boolean isVisibleToUser) {
~~ // 生命周期方法
~~ super.setUserVisibleHint(isVisibleToUser);
~~ mIsVisibleToUser = isVisibleToUser;
~~ if (mIsVisibleToUser && mIsViewCreated) {
~~ getData();
~~ }
~~ }
~~
~~ @Override
~~ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
~~ // 生命周期方法
~~ super.onActivityCreated(savedInstanceState);
~~ if (mIsVisibleToUser) {
~~ getData();
~~ }
~~ }
~~
~~ @Override
~~ public void onDestroyView() {
~~ // 生命周期方法
~~ super.onDestroyView();
~~ mIsViewCreated = false; // 設(shè)置view被銷毀
~~
~~ Log.i("Test", "------onDestroyView-------");
~~ }

fragment的生命周期

step 1. app啟動 展示fragment 1
**fragment 1 **
[正式加載]
setUserVisibleHint ::false::
setUserVisibleHint ::true::
onAttach
onCreate
onCreateView
onViewCreated
onActivityCreated
onViewStateRestored
onStart
onResume

此時(shí)fragment 2 沒有顯示 但預(yù)加載
[預(yù)加載]
setUserVisibleHint ::false::
onAttach
onCreate
onCreateView
onViewCreated
onActivityCreated
onViewStateRestored
onStart
onResume

step 2. 切換到 fragment 2
** fragment 2 **
setUserVisibleHint :: true ::

** fragment 1 **
setUserVisibleHint :: false ::

** fragment 3 **
[預(yù)加載]

step 3. 切換到 fragment 6
**[正式加載] 6 **
[預(yù)加載] 5,7 左右兩邊的

** fragment 1 **
onPause
onStop
onDestroyView

** fragment 2 **
setUserVisibleHint :: false ::
onPause
onStop
onDestroyView

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容