文档章节

fragment+viewPage 界面出现假死情况,

Remix_jx
 Remix_jx
发布于 2016/07/07 16:09
字数 734
阅读 75
收藏 2

今天遇到一个奇葩BUG,fragment+viewpage 界面数据多层叠加在一起,表层数据数据出现假死,列表数据可以在后面滑动。

        一、底部TAB,一般3-5个,点击某个TAB,上面页面也随之切换,早期的时候Android开发者们都会使用 TabActivity去实现,但是TabActivity存在一些问题,也不符合Andoid的单窗口设计的原则,所以已经被废弃,不推荐大家继续使 用。如有业务需求,请优先考虑使用Fragement。

        二、顶部TAB,一般也是3-5个左右,相对于底部TAB风格,顶部TAB一般会引入ViewPager +Fragment的实现方式,这样可以做到左右切换,如微信。

        上述使用到的Fragment,一般很容易会被大家忽略了一个问题。那就是当和Fragment关联的view hierarchy正在被移除时,不会执行onDestroy()方法,而是会调用onDestroyView()。比如上述的风格二ViewPager + Fragment,默认情况下当ViewPager滑动到第三页的时候,第一页的Fragment就会执行onDestroyView,当再次滑动到第二页的时候,第一页的Fragment的onCreateView又会重新执行绘制页面。伴随而来的问题就是成员变量要重新赋值一次,辛苦耗时加载出来的页面又要重新加载一次,这样也就给内存增加了无意思的压力,用户体验上也不大友好,尤其在有网络请求等开销时长比较长的情况下。

那有没有上面解决办法呢?答案是肯定的。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是不能再次添加到另一个新的父布局上面的。 

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

这样也就解决了最前面我遇到的那个bug,由于每次进入都会创建一个View,很多层叠在了一起,所以就出现了"滑不动"的奇怪现象。

感谢博主:http://my.oschina.net/u/2307439/blog/408163

© 著作权归作者所有

下一篇: Anjuta for liunx
Remix_jx
粉丝 6
博文 35
码字总数 21006
作品 0
杭州
Android工程师
私信 提问
winform批量更新数据_长时间的执行会导致界面卡死

  前言:使用winform触发一个事件后执行的代码,如果耗时非常长,则会导致窗口界面假死! 本人最近通过winform窗体执行一项:需要批量更新一批数据库的数据的操作的任务时,由于数据量达到...

深入学习ing
06/27
0
0
大量数据刷新界面时候,放置GUI软件界面僵死

GUI软件开发中,当后台有大量的数据更新需要刷新界面时,往往造成界面假死现象,此时用户的任何鼠标和键盘操作都无效。这种情况一直困扰着许多GUI软件的开发人员。 笔者最近正在参与开发一套...

晨曦之光
2012/04/13
556
0
耗时操作方案总结

跟中学语文课本上面描述的统筹方法一样, 当存在多个任务: 煮饭, 洗衣两个任务发生时, 如何异步的处理所有事情, 节省时间。 非统筹是这样做的【同步方法】: 第一步: 洗米, 煮饭,打开电饭煲 第...

晨曦之光
2012/03/09
195
0
类似 QQ 的文件管理器--AndroidFileManage

这是一个仿 QQ 文件管理器的开源项目。 一些技能 BaseActivity、BaseFragment 的一个分装,fragment 基于懒加载 fragment 嵌套 ViewPage+fragment 的实现 用 rxjava 进行文件的耗时查询 gree...

白痴狒狒
2017/03/29
4.8K
6
iOS多线程归纳

pthread NSThread NSOperation GCD 一.并行队列 1.向并行队列提交同步任务,(根据显示结果可知:所有任务全部在主线程执行,所有任务都是按顺序执行的) 2.向并行队列提交异步任务(根据结果...

Eysolitude
2016/03/08
54
0

没有更多内容

加载失败,请刷新页面

加载更多

玩转 Springboot 2 之热部署(DevTools)

Devtools 介绍 SpringBoot 提供了热部署的功能,那啥是热部署累?SpringBoot官方是这样说的:只要类路径上的文件发生更改,就会自动重新启动应用程序。在IDE中工作时,这可能是一个有用的功能...

桌前明月
46分钟前
3
0
CSS--列表

一、列表标识项 list-style-type none:去掉标识项 disc:默认实心圆 circle:空心圆 squire:矩形 二、列表项图片 list-style-img: 取值:url(路径) 三、列表项位置 list-style-position:...

wytao1995
今天
10
0
linux 命令-文本比较comm、diff、patch

本文原创首发于公众号:编程三分钟 今天学了三个文本比较的命令分享给大家。 comm comm 命令比较相同的文本 $ cat charabc$ cat chardiffadc 比如,我有两个文件char和chardiff如上,...

编程三分钟
今天
9
0
QML教程

https://blog.csdn.net/qq_40194498/article/category/7580030 https://blog.csdn.net/LaineGates/article/details/50887765...

shzwork
今天
7
0
HA Cluster之5

对于使用heartbeat v2版的CRM配置的集群信息都是保存在一个名为cib.xml的配置文件中,存放在/var/lib/heartbeat/crm/下。CIB:Cluster Information Base,由于xml文件配置不是那么方便,所以...

lhdzw
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部