fragment+viewPage 界面出現假死狀況,

今天遇到一個奇葩BUG,fragment+viewpage 界面數據多層疊加在一塊兒,表層數據數據出現假死,列表數據能夠在後面滑動。java

        1、底部TAB,通常3-5個,點擊某個TAB,上面頁面也隨之切換,早期的時候Android開發者們都會使用 TabActivity去實現,可是TabActivity存在一些問題,也不符合Andoid的單窗口設計的原則,因此已經被廢棄,不推薦你們繼續使 用。若有業務需求,請優先考慮使用Fragement。微信

        2、頂部TAB,通常也是3-5個左右,相對於底部TAB風格,頂部TAB通常會引入ViewPager +Fragment的實現方式,這樣能夠作到左右切換,如微信。網絡

        上述使用到的Fragment,通常很容易會被你們忽略了一個問題。那就是當和Fragment關聯的view hierarchy正在被移除時,不會執行onDestroy()方法,而是會調用onDestroyView()。好比上述的風格二ViewPager + Fragment,默認狀況下當ViewPager滑動到第三頁的時候,第一頁的Fragment就會執行onDestroyView,當再次滑動到第二頁的時候,第一頁的Fragment的onCreateView又會從新執行繪製頁面。伴隨而來的問題就是成員變量要從新賦值一次,辛苦耗時加載出來的頁面又要從新加載一次,這樣也就給內存增長了無心思的壓力,用戶體驗上也不大友好,尤爲在有網絡請求等開銷時長比較長的狀況下。ide

那有沒有上面解決辦法呢?答案是確定的。onDestroyView的執行和Activity的onDestroy不同,不會銷燬當前的頁面,因此Fragment的全部成員變量的引用都還在。那就好辦了,咱們在onCreateView的時候,先判斷該取到的數據是否爲空,好比Fragment的根視圖rootView,網絡請求獲取到的數據等,若是不爲空就不用再次執行。這樣一來也就避免了上述說的那些問題的存在了。佈局

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (rootView == null){
            rootView = inflater.inflate(R.layout.fragment_barpage2, container, false);
        }
        if (fromType == null){
            fromType = String.valueOf(getArguments().getInt(ARG_POSITION, 0));
        }
        initView();
        return rootView;
    }

可是須要注意的一點就是,若是重用rootView的話,必定要記得在onDestroyView裏面把rootView先給移除掉,由於已經有過父佈局的View是不能再次添加到另外一個新的父佈局上面的。 spa

@Override
    public void onDestroyView() {
        super.onDestroyView();
        if (recyclerview!= null){
            recyclerview.removeItemDecoration(decoration);
        }
        ((ViewGroup)rootView.getParent()).removeView(rootView);
    }

這樣也就解決了最前面我遇到的那個bug,因爲每次進入都會建立一個View,不少層疊在了一塊兒,因此就出現了"滑不動"的奇怪現象。.net

感謝博主:http://my.oschina.net/u/2307439/blog/408163設計

相關文章
相關標籤/搜索