当前位置: 首页 > 科技观察

组件开发ScrollViewNestedListContainer滑动问题详解

时间:2023-03-20 14:33:19 科技观察

更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.comScrollViewNestedListContainer关于ScrollViewNestedListContainer滑动的问题,在社区Q&A,我也遇到过问了两次的朋友。在帮第一个人解决这个问题的时候,我提供了一个思路和AndroidScrollView嵌套ListView滑动问题的解决方法。方法的修改也解决了他的问题,直到发现第二个朋友也遇到了同样的问题,他才把解决这个问题的全过程记录下来。他打算把这个小问题写成帖子。希望后面遇到“ScrollView嵌套ListContainer滑动问题”的同学能帮到你。思路1、ScrollView嵌套ListContainer,想让ListContainer不滑动,只滚动ScrollView。在Android中,有一个东西叫拦截器,ScrollView的拦截器,通过拦截器的赋值,只滚动ScrollView,不滚动ListView。调用方法因为ScrollView继承自ViewGroup,ViewGroup中有一个dispatchTouchEvent()方法,但是在HarmonyOS中,ScrollView继承自ComponentContainer,ComponentContainer中没有类似dispatchTouchEvent的拦截器方法,所以做不到必须更换拦截器.方法。2、这时候第二个想法也形成了,因为ScrollView的高度是根据其内部组件的高度变化的。当内部组件的高度大于手机屏幕高度时,ScrollView就会滚动,否则不会出现。那么就只能从ScrollView的高度入手了。要改变ScrollView的高度,必须改变其内部组件的高度。那么问题就是ScrollView嵌套了ListContainer。ListContainer的高度只能达到屏幕尺寸或固定在屏幕内,一旦高度达到设置的高度,ListContainer就会自动滚动,ScrollView的滚动也会失效。这里是焦点之间的关系,滑动动作的焦点将在其当前组件上。这里的想法很清楚。ListContainer的高度大于原来设置的高度就会滑动,而ScrollView只有当内部组件的高度大于手机屏幕时才会滑动。那么如果将ListContainer的高度设置为动态固定值,ListContainer的数据将永远不会被填充,ListContainer也不会滑动。马上,如果ListContainer的高度大于屏幕的高度,ScrollView就会滑动。OK,问题找到了,通过解决ListContainer的动态高度解决了滑动冲突。解决这个问题,首先我在写Android的时候找到了动态Listview高度的方法。这里贴图就行了,思路没变。每次添加listview的item高度作为listview的整体高度。listview的高度是动态变化的,listview的高度会随着数据的增加而变化。根据下面的参考,开始写代码。首先,整体布局文件非常简单。ScrollView嵌套ListContainer添加图片效果明显ListContainer的Item布局,这里放个文字很简单创建SampleItem.java,作为ListContainer的数据包装类publicclassSampleItem{privateStringname;publicSampleItem(Stringname){this.name=name;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}}写一个ListContainer的适用配器用于放数据publicclassSampleItemProviderextendsBaseItemProvider{privateListlist;privateAbilitySliceslice;publicSampleItemProvider(Listlist,AbilitySliceslice){this.list=list;this.slice=slice;}@OverridepublicintgetCount(){returnlist==null?0:list.size();}@OverridepublicObjectgetItem(intposition){if(list!=null&&position>=0&&position