2 sonwfly sonwfly 于 2016.02.18 15:33 提问

listView下拉刷新时,为什么同时触发点击事件,如何让下拉时不触发点击事件

/**
* Touch事件
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
Log.e("666","555");

    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            //按下时Y坐标
            // 正在刷新不能移动
            if (currentState == REFRESH) {
                return  true;
            }
                downY = (int) ev.getY();
            Log.e("55555666","555");
            break;
        case MotionEvent.ACTION_MOVE:

            int deltaY = (int) (ev.getY() - downY);

            if(deltaY>0){
                footerView.setPadding(0, -footerViewHeight, 0, 0);
            }

            int paddingTop = -headerViewHeight + deltaY;

            if (paddingTop > -headerViewHeight
                    && getFirstVisiblePosition() == 0) {
                headerView.setPadding(0, paddingTop, 0, 0);

                if (paddingTop > 0 && currentState == PULL) {   //currentState当前状态下拉刷新状态
                    // 进入松开刷新状态
                    currentState = RELEASE;// RELEASE松开刷新状态
                    refreshHeaderView();

                } else if (paddingTop <= 0 && currentState == RELEASE) {
                    // 进入刷新状态
                    currentState = PULL;
                    refreshHeaderView();
                }

                return true;// 拦截TouchMove,不让listView处理该次move事件;会造成listView无法滑动
            }
            break;

        case MotionEvent.ACTION_UP:
            if (currentState == PULL) {
                headerView.setPadding(0, -headerViewHeight, 0, 0);
            } else if (currentState == RELEASE) {
                headerView.setPadding(0, 0, 0, 0);
                currentState = REFRESH;
                refreshHeaderView();
                if (listener != null) {
                    listener.onPullrefresh();
                }

            }

            break;
        default:
            break;
    }
    isRecored =true;
    return super.onTouchEvent(ev);

}

3个回答

devmiao
devmiao   Ds   Rxr 2016.02.18 21:56
Mr_dsw
Mr_dsw   Ds   Rxr 2016.02.18 22:02

listview内部肯定会有一个TouchEvent进行处理,你搞清楚事件分发进行处理

hyb1996
hyb1996   2016.02.18 22:03

因为下拉刷新要经过三个步骤(自己在手机上做一遍),点击屏幕(DOWN),下拉(MOVE),松开(UP),自然就会触发相应的事情,但如果你要将"下拉"和"点击"事情分开处理,应该不要在DOWN事件处理所谓的点击,而是在UP时处理。以下简陋的代码说明一下基本思路,手机不好码代码。boolean isMOVE = false; 。。。switch(..) case MOVE: isMOVE=true; ...case UP: if(!isMOVE){onClick();//处理点击事件 }else{isMOVE=false;//这是MOVE之后的UP事件,应该将记录变量重置}

brian512
brian512 请问试过吗,点击事件基本上也会触发move,所以一个ismove并不够,需要在up事件中判断坐标与down时的坐标差值,小于一定值侧可判断为点击事件
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!