ViewPager内卡顿

来源:互联网 发布:gta5捏脸数据御姐 编辑:程序博客网 时间:2024/06/05 01:15

情景

1、ViewPager丢失监听事件
2、从其他页面切换到含有ViewPager的页面卡顿

解决

一、ViewPager丢失监听事件

项目中实际情况:从其他View跳转到ViewPager,丢失一次ViewPager监听事件。
原因分析:ViewPager内有个mFirstLayout参数,
解决方式:给ViewPager添加 监听

        viewPager.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {            @Override            public void onViewAttachedToWindow(View v) {                v.requestLayout();            }            @Override            public void onViewDetachedFromWindow(View v) {            }        });
重新请求 layout就可以解决,这个BUG只发现在华为手机上有。


二、从其他页面切换到含有ViewPager的页面卡顿

项目实际情况:项目中ViewPager 内View 形式为  ScrollView 嵌套 ExpandableListView。
卡顿原因分析:
1、ViewPager 重新请求布局
2、ViewPager 缓存
3、ExpandableListView getGruopView 和 getChildView 耗时
1 和 2都不是主要问题。
解决办法:

1、ViewPager 切换到其他View 时,将ViewPager 内 各page setVisiable GONE
2、对ExpandableList,在ViewPager切换出去时,记录group的展开或折叠状态。
3、记录 scrollView 的 Y值
4、在其他View 切换到ViewPager时,通过 handler,执行-- 恢复ExpandableListView状态 -- 恢复 scrollView Y轴 -- 当前 page setVisiable Visiable
显示结果:其他View进入Viewpager,先显示空白,再显示具体内容。解决了切换到ViewPager时的卡顿问题。

总结:主要思路

1、ExpandableListView,如果折叠,这时候就不会执行 getChildView 省时。
2、Pager 执行 GONE 的主要意义在于 不要让用户看到 折叠 -- 展开 -- scrollTo Y的动作。一切动作做完后,在Visiable