在setOnTouchListener上获取Click事件

时间:2014-12-21 07:04:30

标签: android android-layout android-listview android-custom-view android-scrollview

我在Android应用程序中工作,我希望在自定义Listview中的textview的setOnTouchListener中获取click事件。当我从setOnTouchListener返回true时,我得到了正确的click事件,但是ListView的滚动在textview的那一部分不起作用,因为我在ListView中已经有另一个click事件,我已经重写了ListView setOnTouchListener。

ListView setOnTouchListener

convertView.setOnTouchListener(new OnTouchListener(){

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        if (IsTablet) {
            if (mDetailList.size() > 3)
                v.getParent().requestDisallowInterceptTouchEvent(true);
        } else {
            if (mDetailList.size() > 2)
                v.getParent().requestDisallowInterceptTouchEvent(true);
        }
        return false;

    }
});

TextView setOnTouchListener

private float mDownX;
private float mDownY;
private final float SCROLL_THRESHOLD = 10;
private boolean isOnClick;

@Override
public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            mDownX = ev.getX();
            mDownY = ev.getY();
            isOnClick = true;
            break;
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP:
            if (isOnClick) {
                Log.i(LOG_TAG, "onClick ");
                //TODO onClick code
            }
            break;
        case MotionEvent.ACTION_MOVE:
            if (isOnClick && (Math.abs(mDownX - ev.getX()) > SCROLL_THRESHOLD || Math.abs(mDownY - ev.getY()) > SCROLL_THRESHOLD)) {
                Log.i(LOG_TAG, "movement detected");
                isOnClick = false;
            }
            break;
        default:
            break;
    }
    return true;
}

有什么方法可以通过从TextView setOnTouchListener返回false来获取click事件,或者请建议我另一个解决此问题的方法。

1 个答案:

答案 0 :(得分:2)

我为自己的问题找到了解决方案。

我没有覆盖ListView的setOnTouchListener,而是自定义了ListView并覆盖了自定义ListView中的onInterceptTouchEvent事件。

请参阅以下代码:

public class CustomListView extends ListView {

    public CustomListView(Context context,
            List<DetailSummaryMonth> detailSummaryMonths) {
        super(context);
        init(context);

    }

    public CustomListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public CustomListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

    private void init(Context context) {

    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {

        if (getAdapter().getCount() > 3)

            getParent().requestDisallowInterceptTouchEvent(true);

        return super.onInterceptTouchEvent(ev);
    }

}