您的位置:首页 > 移动开发 > Android开发

解决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 {

/**
* 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);
}


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android gridview listview