我在一个Android应用程序中工作,我想在自定义Listview内的textview的setOnTouchListener中获取click事件。当我从setOnTouchListener返回true时,我正确地获得了click事件,但ListView的滚动将无法在文本视图的该部分工作,因为该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事件,或者请建议我解决该问题的另一种方法。

最佳答案

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

我没有覆盖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);
    }

}

07-26 08:26