前沿:有時候,listview 的item要顯示的字段比較多,考慮到顯示問題,item外面不得不嵌套ScrollView來實作,于是問題來了,當listview需要做點選事件時,由于ScrollView的嵌套使用,攔截了listvew點選事件:隻好重寫listview來實作洛
/**
*
* @author 作者:易皇星
*
* @da2016年10月24日 時間:
*
* @toTODO 類描述: 解決 ListView中嵌套ScrollView,ScrollView攔截ListView的Item點選事件的解決辦法
*
*
* 在listview中嵌套ScrollView,發現橫滑豎滑都正常,但是無法單擊Listview的Item。查詢Android分發機制後解決,繼承Listview重寫Listview的onInterceptTouchEvent。
*
* onInterceptTouchEvent中總是調用listview的onTouchEvent保證listview的事件都執行,
* super.onInterceptTouchEvent(ev)不會攔截需要傳遞給ScrollView的橫滑。
*/
public class MyListView extends ListView {
private int flag = ;
private float StartX;
private float StartY;
public MyListView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public MyListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
@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) {
float ScollX = ev.getX() - StartX;
float ScollY = ev.getY() - StartY;
// 判斷是橫滑還是豎滑,豎滑的話攔截move事件和up事件(不攔截會由于listview和scrollview同時執行滑動卡頓)
if (Math.abs(ScollX) < Math.abs(ScollY)) {
flag = ;
return true;
}
return false;
}
if (ev.getAction() == MotionEvent.ACTION_UP) {
if (flag == ) {
return true;
}
return false;
}
return super.onInterceptTouchEvent(ev);
}
}