androidwebview嵌套
Ⅰ android scrollview嵌套webview和listview,怎么滑动不卡顿
只要是listview上下滑动卡顿,其主要原因是因为在listview填充适配器的时候。在重写的类BaseAdapter方法
getView();被无限的循环的调用;这样消耗了大量的内存导致listview上下滑动的时候,出现了卡顿。原因就在于measure过
程,ListView一般都会根据屏幕加载多个Item,而且也会同时显示这些已经加载过的若干组Item,而这些Item的父元素都是这个
ListView。
通过Google的解释:View在Draw的时候分成两个阶段:measure和layout,在measure阶段时主要就是为了计算两个参
数:height和width。而且要注意的是,这是个递归的过程,从顶向下,DecorView开始依次调用自己子元素的measure。计算完成这两
个参数后就开始layout,最后再是draw的调用。对于ListView,当然每一个Item都会被调用Measure方法,而在这个过程中
getView和getCount会被调用,而且看用户的需求,可能会有很多次调用。问题就在于在layout中的决定ListView或者它的父元素的
height和width属性的定义了。 根据我的经验,height和width最好都设置成fill_parent,这样能避免listview对getView的疯狂调用。 解决方法就是尽量避免自适应,除非是万不得已,固定大小或者填充的效果会比较好一些。 还有一点请注意,如果使用了上面的动态测量来设置listview的显示高度,并使用了fill_parent来设置了listview的属性,但是仍然不能停止adapter中getView()方法的疯狂调用;或者还伴有listview内容显示仍然不完全现象; 根据我自己的实践经验来讲,你可以这样做: 把listview放置在LinearLayout中,<LinearLayout中只存在一个listview>; 我推断是,当你通过动态测量加载的时候,ta需要一个独立的空间。
Ⅱ Android 解决viewPager中嵌套webView的滑动冲突
在工作中遇到了一种情况,在可以横向滑动的viewPager其中的一项中嵌套着一个webView,并且在这个webView中也有可以横向滑动的的类似viewPager的组件,因为webView其中的H5组件我们是无法控制的,因此便会发生滑动冲突,现象则是webView中的H5组件无法滑动。比如下图
经过笔者的一阵搜索,借鉴了 Viewpager与webview滑动冲突的解决方案 一文的解决方案,并在其基础上改进了一下,使之处理起来更加简单一些。
首先我们先确定滑动冲突是事件分发机制的事情。解决办法需要在需要的地方进行事件的拦截和分发可以使用下面的方法
当为true的时候则说明父控件(也就是viewPager)不拦截事件,点击事件由子控件(也就是webView)来处理,反之为false的时候,父控件则拦截点击事件,子控件无法响应点击事件。
此时我们需要Android原生和JS交互一下,来通知我们什么时候拦截事件,什么时候不拦截事件。首先我们要先和H5的小伙伴商量好方法名和参数,在H5中可以监听到是否点击了或者滑动了轮播图,H5的小伙伴可以在监听值判断,如果点击或者滑动了H5中的轮播图则,调用Android原生的方法参数为true,Android端则进行事件的拦截,反之没有点击或者滑动的时候,则调用方法参数为false。
交互方法:
如果有不懂Android原生与H5交互方法的可以看我的一篇文章 <Android中webveiw与H5进行交互>
此时我们拿到参数以后就可以进行事件的拦截
这样就可以对事件分发进行处理,不过此处需要注意的是拦截事件的方法 wb.(isIntercept);必须要写在Touch事件中才可以生效,写在webview初始化的地方是不可以的。
ok,笔者认为这种方法比H5端去测量轮播图的位置,然后告诉Android端,Android端再去判断位置去拦截事件要简单一些。当然这只是个人想法,还是要感谢借鉴文章的大佬,毕竟是站在了巨人的肩膀上。