如何处理ListView的滚动事件和我自己的OnTouch方法?

时间:2017-01-24 17:29:23

标签: android listview events touch

我在ListView内的onTouchListener上有一个RealitveLayout和一个ListView。它工作得很好,我得到了触摸坐标,只要我不开始滚动,因为ListView从我的OnTouchEvent方法“窃取”触摸事件,并调用ACTION_CANCEL。如果我在requestDisallowInterceptTouchEvent(true)上设置ListView,我的OnTouchEvent方法效果很好,它可以很好地跟踪移动,但ListView不会滚动。我怎样才能实现ListView滚动和我的方法获得事件? 以下是相关代码:(从touch()上的适配器调用RelativeLayout方法,并在此活动的ListView方法中初始化onCreate() < / p>

@Override
public void touch(MotionEvent event) {
    int x = (int) event.getX();
    int y = (int) event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            Log.i("TAG", "touched down");
            FriendlyTouch friendlyTouch = new FriendlyTouch(true, x, y, key);
            mMessagesDatabaseReference2.setValue(friendlyTouch);
            break;
        case MotionEvent.ACTION_MOVE:
            Log.i("TAG", "moving: (" + x + ", " + y + ")");
            FriendlyTouch friendlyTouch1 = new FriendlyTouch(true, x, y, key);
            mMessagesDatabaseReference2.setValue(friendlyTouch1);
            break;
        case MotionEvent.ACTION_UP:
            Log.i("TAG", "touched up");
            mMessagesDatabaseReference2.child("TouchDown").setValue(false);
            break;
        case MotionEvent.ACTION_SCROLL: //this doesnt seem to do anything`
            Log.i(TAG, "scrolled");
            FriendlyTouch friendlyTouch2 = new FriendlyTouch(true, x, y, key);
            mMessagesDatabaseReference2.setValue(friendlyTouch2);
            break;
        case MotionEvent.ACTION_CANCEL:
            Log.i(TAG, "cancelled");
            mMessagesDatabaseReference2.child("TouchDown").setValue(false);
            break;
    }

}

2 个答案:

答案 0 :(得分:0)

方法&#34; boolean onTouchEvent(MotionEvent e)&#34;从你的ontouchlistener返回false? False应该允许其他侦听器也获得touchEvent。如果返回true,则不会调用其他touchlisteners。

答案 1 :(得分:0)

我猜你也可以通过扩展const source = map.getSource('mySource'); source.pause(); source.play(); 来构建CustomListView。 然后你应该覆盖ListView,这个方法负责取消你的onTouch事件,而不是执行滚动(至少在我的情况下)。

onInterceptTouchEvent(MotionEvent ev)

如果你真的需要同时工作,我想你唯一的机会是覆盖ListView的@Override public boolean onInterceptTouchEvent(MotionEvent ev) { if(youWantScrollingToWork()){ return super.onInterceptTouchEvent(ev); }else{ //don`t scroll, instead continue your own touchEvent return false; } } ,然后让它返回false,这样你的监听器仍然会被调用,但这看起来很讨厌。