0

リストビューでロングクリックと左右のスワイプの両方を実装し、アクションが実行されたリスト項目を取得する必要があります。この方法は本当に有望に思えました。問題: 1.ACTION_MOVE は最初に 1 回だけ実行されるため、差分は最小限に抑えられます。これが私が試したことです..アイテムクリック/アイテムロングクリックを実行させるために偽のアクションを起動することは可能ですか?

public boolean onTouch(View v, MotionEvent event) 
    {
        switch (event.getAction()) 
        {
        case MotionEvent.ACTION_DOWN: 
            downX = event.getX();
            downY = event.getY();
            mSwipeDetected = Action.NONE;
            Log.i("MyTags","Down Event");
            Log.i("MyTags",String.valueOf(downX)+","+String.valueOf(downY));
            return false; // allow other events like Click to be processed
        case MotionEvent.ACTION_MOVE: 
            upX = event.getX();
            upY = event.getY();
            Log.i("MyTags","Move Event");
            Log.i("MyTags",String.valueOf(upX)+","+String.valueOf(upY));
            moveEnabled=true;
            return false;
        case MotionEvent.ACTION_UP:
            upX = event.getX();
            upY = event.getY();
            Log.i("MyTags","UP Event");
            Log.i("MyTags",String.valueOf(upX)+","+String.valueOf(upY));
            return false;
        default:
            upX = event.getX();
            upY = event.getY();
            Log.i("MyTags","Default Event");
            Log.i("MyTags",String.valueOf(upX)+","+String.valueOf(upY));
            if(moveEnabled)
            {
                diffX=downX-upX;
                diffY=downY-upY;
                abs_X=Math.abs(diffX);
                abs_Y=Math.abs(diffY);

                moveEnabled=false;
                if((abs_X>abs_Y)&(abs_X>MINIMUM_X))
                {
                    if(diffX>0)
                    {
                        mSwipeDetected=Action.LEFT;
                        Log.i("MyTags","Left Swipe");
                        event.setAction(MotionEvent.ACTION_UP);
                        return false;
                    }
                    else if(diffX<0)
                    {
                        mSwipeDetected=Action.RIGHT;
                        Log.i("MyTags","Right Swipe");
                        event.setAction(MotionEvent.ACTION_UP);
                        return false;
                    }
                }
            }
            return false;
        }

    }
4

1 に答える 1

1

問題を修正するためにハックを使用しました。イベントが消費されるため、onitemclickイベントで結果が得られません。私が行ったことは、スワイプアクションが検出されたら、自分のDownイベントとUpイベントを発生させ、それらの偽のイベント中にfalseを返し、itemclickリスナーに渡されるようにすることです。イベントは結果から2回読み取られるように見えるため、ここでは少し注意する必要があります。このために、出力を含めることでリスナーのオンとオフを切り替えます。

ACTION_MOVE:
 //when swipe is detected fire a fake down event
 event.setAction(MotionEvent.ACTION_DOWN);
 v.dispatchTouchEvent(event);
ACTION_DOWN:
  if(fake down event)
     //set some flags & dispatch fake event
     event.setAction(MotionEvent.ACTION_UP);
     v.dispatchTouchEvent(event);
     return false
   else do regular handling
ACTION_UP:
    if fake down event
       dispatch fake up event
    else ..

ここで「v」はイベントを発生させる必要のあるビューであり、私の場合はリストビューです。すぐには使用できないため、swipeDetectorクラスのコンストラクターを介して渡す必要があります。次のように..

ListView v;
SwipeDetector(ListView lv)
{
    this.v=lv;
}
于 2012-12-25T12:36:25.270 に答える