解决ListView setOnItemLongClickListener 长按无响应(嵌套GridView)
2016-07-04 15:39
615 查看
博客源址:http://blog.csdn.net/u013844789/article/details/50379323
问题背景介绍:
ListView item中包含GridView,现要为ListView添加setOnItemLongClickListener事件,添加完成后测试发现点击GridView所在区域无响应。
问题原因分析:
事件分发基础知识:Android事件分发机制为自上而下分发,即Activity–>ViewGroup–>View。其中事件分发主要由三个方法进行控制,onTouchEvent、dispatchTouchEvent、onInterceptTouchEvent(ViewGroup独有),控制方法为返回相应的返回值。当前情景事件分发流程:用户点击GridView区域后,事件从Activity传到ListView,再从ListView传到GridView,然后调用GridView的onTouchEvent事件。原因分析:当事件传递到GridView时,由于item添加了onItemClickListener,所以事件被消耗,没有回调到ListView OnItemLongClick方法。
解决办法:
自定义GridView,并重写OnTouchEvent方法,在onTouchEvent方法中判断用户当前操作是否为长按,如果为长按则调用super.performLongClick()方法
以下是代码实现
import java.util.Timer;
import java.util.TimerTask;
import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import android.widget.GridView;
public class ExpendableGridView extends GridView {
}
问题背景介绍:
ListView item中包含GridView,现要为ListView添加setOnItemLongClickListener事件,添加完成后测试发现点击GridView所在区域无响应。
问题原因分析:
事件分发基础知识:Android事件分发机制为自上而下分发,即Activity–>ViewGroup–>View。其中事件分发主要由三个方法进行控制,onTouchEvent、dispatchTouchEvent、onInterceptTouchEvent(ViewGroup独有),控制方法为返回相应的返回值。当前情景事件分发流程:用户点击GridView区域后,事件从Activity传到ListView,再从ListView传到GridView,然后调用GridView的onTouchEvent事件。原因分析:当事件传递到GridView时,由于item添加了onItemClickListener,所以事件被消耗,没有回调到ListView OnItemLongClick方法。
解决办法:
自定义GridView,并重写OnTouchEvent方法,在onTouchEvent方法中判断用户当前操作是否为长按,如果为长按则调用super.performLongClick()方法
以下是代码实现
import java.util.Timer;
import java.util.TimerTask;
import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import android.widget.GridView;
public class ExpendableGridView extends GridView {
/** * handler */ private Handler handler; /** * 触发长按事件 */ private Runnable performLongClick = new Runnable() { @Override public void run() { ExpendableGridView.super.performLongClick(); } }; public ExpendableGridView(Context context) { super(context); handler = new Handler(); } public ExpendableGridView(Context context, AttributeSet attrs) { super(context, attrs); handler = new Handler(); } @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: handler.postDelayed(performLongClick, ViewConfiguration.getLongPressTimeout()); break; case MotionEvent.ACTION_MOVE: handler.removeCallbacks(performLongClick); break; case MotionEvent.ACTION_UP: handler.removeCallbacks(performLongClick); break; default: break; } return super.onTouchEvent(ev); }
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories