天天看點

Android 解決 ListView的item中嵌套ScrollView,ScrollView攔截ListView的Item點選事件的解決辦法

前沿:有時候,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);
    }

}
           

繼續閱讀