Android ScrollView中嵌套ListView,滑动冲突问题的解决
来源:互联网 发布:java创建方法 编辑:程序博客网 时间:2024/04/29 14:26
在项目开发过程,遇到ScrollView中嵌套ListView,结果点击ListView上下滑动时,整个页面滑动,也就是滑动事件被ScrollView消费掉了,造成listView无法滑动的结果,然后改动布局,替换成fragment,在fragment里面实现listview的刷新,结果还是不行,最后从view的事件分发机制入手,在滑动listView的时,屏蔽掉ScrollView的滑动事件,让滑动事件交给listView处理,才解决掉滑动事件冲突的问题,以下是代码
(另:ScrollView嵌套时,又出现了一种情况,即当ScrollView没有布满整个手机屏幕事,listView的huadong事件不会被ScrollView消费掉,而是可以继续滑动,这种情况没有写Demo验证,只是看到同事的运行结果如此,不知是不是ScrollView源码中判断了布局是否占满整个屏幕,而后设置是否消费滑动事件)
以下是我学习资料中,关于事件分发机制的部分:
listView..setOnItemClickListener()与listView.setOnItemLongClickListener()冲突问题(好像在Android 5.1之前没有这个问题),长按item时同样会触发item的点击事件,解决方法是将长按事件方法中,默认的return false改为return true即可;原因见:http://blog.csdn.net/u012527802/article/details/47338263
一、简介 :
Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev)、onInterceptTouchEvent(MotionEvent ev)、onTouchEvent(MotionEvent ev);能够响应这些方法的控件包括:ViewGroup、View、Activity。方法与控件的对应关系如下表所示:
ViewGroup
View
Activity
public boolean dispatchTouchEvent(MotionEvent ev)事件分发
Yes Yes Yes public boolean onInterceptTouchEvent(MotionEvent ev)
事件拦截
Yes Yes / No No public boolean onTouchEvent(MotionEvent ev)事件响应
Yes Yes Yes
从这张表中我们可以看到 ViewGroup 和 View 对与 Touch 事件相关的三个方法均能响应,而 Activity 对 onInterceptTouchEvent(MotionEvent ev) 也就是事件拦截不进行响应。另外需要注意的是 View 对 onInterceptTouchEvent(MotionEvent ev) 的响应的前提是可以向该 View 中添加子 View,如果当前的 View 已经是一个最小的单元 View(比如 TextView),那么就无法向这个最小 View 中添加子 View,也就无法向子 View 进行事件的拦截,所以它没有 onInterceptTouchEvent(MotionEvent ev)。
其中调用了onInterceptTouchEvent()和onTouchEvent(),一般不重写该方法onInterceptTouchEvent()用来拦截事件。
ViewGroup类中的源码实现就是{return false;}表示不拦截该事件,
事件将向下传递(传递给其子View);
若手动重写该方法,使其返回true则表示拦截,事件将终止向下传递,
事件由当前ViewGroup类来处理,就是调用该类的onTouchEvent()方法onTouchEvent()用来处理事件。
返回true则表示该View能处理该事件,事件将终止向上传递(传递给其父View);
返回false表示不能处理,则把事件传递给其父View的onTouchEvent()方法来处理
- •如果 onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理;
- •如果 onInterceptTouchEvent 返回 false,则表示将事件放行,当前 View 上的事件会被传递到子 View 上,再由子 View 的 dispatchTouchEvent 来开始这个事件的分发;
- •如果 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev),事件默认不会被拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理。
- •如果事件传递到当前 View 的 onTouchEvent 方法,而该方法返回了 false,那么这个事件会从当前 View 向上传递,并且都是由上层 View 的 onTouchEvent 来接收,如果传递到上面的 onTouchEvent 也返回 false,这个事件就会“消失”,而且接收不到下一次事件。
- •如果返回了 true 则会接收并消费该事件。
- •如果返回 super.onTouchEvent(ev) 默认处理事件的逻辑和返回 false 时相同。
- Android ScrollView中嵌套ListView,滑动冲突问题的解决
- Android ScrollView中嵌套ListView,滑动冲突问题的解决
- 【Android界面实现】解决ScrollView中嵌套Listview,Listview中嵌套Listview显示不完整和滑动冲突的问题
- 【Android界面实现】解决ScrollView中嵌套Listview,Listview中嵌套Listview显示不完整和滑动冲突的问题
- 【Android界面实现】解决ScrollView中嵌套Listview,Listview中嵌套Listview显示不完整和滑动冲突的问题
- 【Android界面实现】解决ScrollView中嵌套Listview,Listview中嵌套Listview显示不完整和滑动冲突的问题
- Android解决ScrollView嵌套ListView滑动冲突问题
- 解决ListView嵌套在ScrollView中滑动冲突问题
- Android中ScrollView和listView嵌套 滑动冲突解决
- 解决ScrollView嵌套ListView滑动冲突显示不全的问题
- 解决ScrollView中嵌套Listview,Listview显示不完整和滑动冲突的问题
- android ListView/GridView与ScrollView嵌套的滑动冲突解决
- 解决ScrollView中嵌套Listview,Listview中嵌套Listview显示不完整和滑动冲突的问题
- 解决ScrollView中嵌套Listview,Listview中嵌套Listview显示不完整和滑动冲突的问题
- 完美解决Android里面scrollview嵌套及listview嵌套viewpager的滑动冲突问题的简单方法
- ScrollView中嵌套ListView和GridView冲突问题的解决
- 解决scrollView嵌套listview的冲突问题
- Scrollview嵌套listVIew冲突问题的解决
- vue 部署到线上问题
- MySQL基础1--基础操作
- caffe 源码导读(一)了解protobuf
- 随笔,不定时更新
- 【Python数据分析与展示】(一)numpy基础
- Android ScrollView中嵌套ListView,滑动冲突问题的解决
- SimpleArrayMap 源码解析
- 521. Longest Uncommon Subsequence I
- Python命令行下退格、删除、方向键乱码问题解决(亲测有效)
- Oracle DG broker搭建
- POJ 3122.Pie
- 14-CSS3提高 重点部分 盒模型 浮动和定位
- redmine插件编写
- MySQL数据库批量插入(Spring Boot+Mybatis)