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设计

相关文章
相关标签/搜索