您的位置:首页 > 其它

Viewpager+Fragment+GridView 滑动切换时卡顿解决..

2017-03-01 10:36 507 查看
使用viewpager切换fragment时,发现有卡顿现象

在fragment onCreateView 设置log打印

发现onCreateView 重复调用

..加了判断 if(view ==null)重新加载0.0 

/**
* 初始化模块
*/
@Override
public View onCreateView(final LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (view == null) {
view = inflater.inflate(R.layout.car_serve_activity, null);
adapter = new IconAdapter(getActivity());
             mRedpassApp = (RedpassApp) getActivity().getApplication();
             ensureUi();
}
Log.e("fragment", "car_createview");
// setTopBar();
return view;
}

@Override
public void onDestroyView() {
super.onDestroyView();
if (view != null) {
((ViewGroup) view.getParent()).removeView(view);
}
}
再次测试..

发现onCreateView 依旧重复调用..卡顿减小了一丝丝..

检查onCreateView中是否执行了耗时操作..

so  GridView 里耗时操作?

检查xml layout 发现 gridview <GridView
android:id="@+id/car_serve_gridView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip"
android:layout_marginTop="10dip"
android:gravity="center"
android:horizontalSpacing="3dp"
android:listSelector="@android:color/transparent"
android:numColumns="3"
android:stretchMode="columnWidth"
android:verticalSpacing="3dp" >
</GridView>
android:layout_width="wrap_content"


  是否因为 onCreateView 执行了耗时操作 ontMeasure()

改成match_parent;

唔...效果好些好了一点。

然道是滑动的阻尼系数导致滑动切换时的卡顿?

还是ViewPage 触摸事件分发GridView ?

最后问题定位到ViewPager的嵌套上,因为在ViewPager所包含的view中包含了GridView组件,因此在滑动的时候有一定几率touch事件会被GridView处理掉,从而导致不灵敏。

根源还是touch事件的传递就处理流程上,解决方案是集成ViewPager然后在onInterceptTouchEvent中加入如下代码:

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {

boolean res = super.onInterceptTouchEvent(event);
if(event.getAction() == MotionEvent.ACTION_DOWN) {
preX = event
4000
.getX();
} else {
if( Math.abs(event.getX() - preX)> 4 ) {
return true;
} else {
preX = event.getX();
}
}
return res;
}


即判断如果移动距离超过一定数值则认为滑屏操作,ViewPager就直接进行截取处理,不再传递到子view去。
OK,再次测试,发现卡顿基本消失了..流畅如飞啊~

可是这个onCreateView Log还是打印了出来0.0啥子问题?

继续翻阅资料..

查看API文档,只需要设置ViewPage缓存页面数即可。

mPager.setOffscreenPageLimit(3);

再次测试..Log 没有再跳出来了

值得注意的是..缓存页面 int 不要弄太多0.0占用资源..
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: