如何解决scrollview嵌入listview时,item点击事件分发
1个回答
展开全部
在listview中嵌套ScrollView,发现横滑竖滑都正常,但是无法单击Listview的Item。查询android分发机制后解决,继承Listview重写Listview的onInterceptTouchEvent。
onInterceptTouchEvent中总是调用listview的onTouchEvent保证listview的事件都执行, super.onInterceptTouchEvent(ev)不会拦截需要传递给ScrollView的横滑。
int flag = 0;
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
//总是调用listview的touch事件处理
onTouchEvent(ev);
if(ev.getAction()==MotionEvent.ACTION_DOWN){
StartX = ev.getX();
StartY = ev.getY();
return false;
}
if(ev.getAction()==MotionEvent.ACTION_MOVE){
ScollX = ev.getX()-StartX;
ScollY = ev.getY()-StartY;
//判断是横滑还是竖滑,竖滑的话拦截move事件和up事件(不拦截会由于listview和scrollview同时执行滑动卡顿)
if(Math.abs(ScollX)<Math.abs(ScollY)){
flag = 1;
return true;
}
return false;
}
if(ev.getAction()==MotionEvent.ACTION_UP){
if(flag==1){
return true;
}
return false;
}
return super.onInterceptTouchEvent(ev);
}
http://img0.ph.126.net/CyDdSOde4eoMVlJkqTmtuQ==/6631461390862773987.jpg
onInterceptTouchEvent中总是调用listview的onTouchEvent保证listview的事件都执行, super.onInterceptTouchEvent(ev)不会拦截需要传递给ScrollView的横滑。
int flag = 0;
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
//总是调用listview的touch事件处理
onTouchEvent(ev);
if(ev.getAction()==MotionEvent.ACTION_DOWN){
StartX = ev.getX();
StartY = ev.getY();
return false;
}
if(ev.getAction()==MotionEvent.ACTION_MOVE){
ScollX = ev.getX()-StartX;
ScollY = ev.getY()-StartY;
//判断是横滑还是竖滑,竖滑的话拦截move事件和up事件(不拦截会由于listview和scrollview同时执行滑动卡顿)
if(Math.abs(ScollX)<Math.abs(ScollY)){
flag = 1;
return true;
}
return false;
}
if(ev.getAction()==MotionEvent.ACTION_UP){
if(flag==1){
return true;
}
return false;
}
return super.onInterceptTouchEvent(ev);
}
http://img0.ph.126.net/CyDdSOde4eoMVlJkqTmtuQ==/6631461390862773987.jpg
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询