Android中ScrollView与listView冲突以及ScrollView与listView无法滑动(拖动)解决办法
来源:互联网 发布:来自远古星星的你 知乎 编辑:程序博客网 时间:2024/06/06 00:37
应用场景:ScrollView 套 Listview
一、 冲突显现:
当listview 高度设置为wrap_content时,实际效果是 listview 只显示一条item多一点点,且不能滑动,
出现该现象的原因是:
listview在渲染界面的时候,它不知道自己的整个高度是多少,所以默认自己搞了一条;
不能滑动的问题下面会说。
对listview的设置如下:
<ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_marginTop="5dp" android:fillViewport="true" android:dividerHeight="5dp" />
处理方案:
通过代码计算出每一个item的高度,以及分割线的总高度,设置为listview的高度,
这样,listview全部显示出来了,但是只能scrollview滑动
代码如下:
public void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); params.height += 5;//上面的分割线设置为5dp,所以这里每次加5个像素 listView.setLayoutParams(params); }
二、listview固定高度,listview显示不全,且listview部分不能滑动
当我们给listview固定高度时,listview能渲染出多个item,但是问题来了,还是不能滑动。
代码实例:
<ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="400dp" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_marginTop="5dp" android:fillViewport="true" android:dividerHeight="5dp"/>
为什么会这样呢?
原因是这样的:scrollview要滑动,listview也要滑动,那么View的事件分发的时候就出现了冲突了;当手指放在屏幕上的时候,因为外层的是scrollview,
所以View默认把滑动的事件给了scrollview,listview没有触发滑动的事件;但是当用A、B两个手指先后按在listview上滑动的时候,listview
是能动的,但是很不流畅,这一现象说明:两个手指获取焦点的时候View把获取焦点的事件给了listview。
好,那现在问题都出来了,那就好办了,我们对listview进行获取焦点的监听,当listview获得触摸焦点的时候,让srcollview的触摸事件消失:
listView.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_MOVE) { scrollView.requestDisallowInterceptTouchEvent(true); } return false; }});最后的总结与建议:当前问题是解决了,但是在用户体验上,android这边没有IOS的那么流畅,Google官方也不提倡ScrollView 套 Listview这样搞,但是当遇到不懂技术的
产品经理要这样干:外层要滑动,里层也要滑动的时候,就只能这么干了。
0 2
- Android中ScrollView与listView冲突以及ScrollView与listView无法滑动(拖动)解决办法
- android ScrollView与ListView,GridView滑动冲突
- ListView与ScrollView的滑动冲突解决方法
- ListView与ScrollView滑动冲突问题
- ScrollView与Listview滑动冲突解决
- 解决ListView与ScrollView的滑动冲突
- 解决ScrollView 与 ListView 的滑动冲突
- ScrollView与ListView 的滑动冲突
- scrollview与listview冲突
- ListView与ScrollView冲突
- android ListView/GridView与ScrollView嵌套的滑动冲突解决
- Android 解决SwipeRefreshLayout与ListView和ScrollView滑动冲突
- Android 自定义SwipeRefreshLayout与ListView、ScrollView滑动兼容冲突
- ScrollView中嵌套ListView与GridView时滑动冲突解决方案
- listview与ScrollView冲突的解决办法
- GridView/ListView与ScrollView冲突解决办法
- ScrollView与ListView,GridView共存冲突解决办法 Android
- ScrollView与ListView,GridView共存冲突解决办法 Android
- CentOS6.3安装Hadoop2.6.0_伪分布式配置
- 6lowpan简介
- 文件的操作(RandomAccessFile类)
- const用法
- LeetCode 237. Delete Node in a Linked List
- Android中ScrollView与listView冲突以及ScrollView与listView无法滑动(拖动)解决办法
- C# 冒泡排序法
- 使用Crontab定时备份数据库
- c/c++冒泡排序(BubbleSort)
- 玩转Eclipse开发工具(一)
- ajax自动提交表单数据,经php处理返回数据
- React Native控件之TextInput组件介绍以及实际登录界面实现
- Android应用架构之Retrofit使用
- 二分类问题的评价指标:ROC,AUC