4

私のアクティビティにはリストビューがあり、そのために と の両方がonItemClickListenerありonTouchListenerます。list.OnTouchメソッドの行をクリックすると、 forMotionEvent Downとが呼び出されUpます。どちらの場合も、タッチイベントを処理したくないが、それを観察したいだけなので、「false」を返します。現時点では、電話するべきだったと思いonItemClickますが、それは起こりません。しかし、リストビューを移動すると、OnTouchモーションイベント「move」が呼び出され、その後アイテムをクリックするとトリガーされます。では、なぜitemClick最初にトリガーされず、リストビューでの移動後にトリガーされたのですか?

コード:

public class MainActivity extends Activity {

Handler rHandler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ListView lv = (ListView) this.findViewById(R.id.mylist);
    lv.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            System.out.println("An Item is clicked not touched");
        }

    });
      rHandler = new Handler(this,lv);
    }


 }

アダプターにカスタム ListView lv を入力していますが、そのリスト行は textViews と imageViews で構成されています。また、imageViews にいくつかの onclick イベントがあります。そのため、android:focusable と android:focusableInTouchMode を imageView.

Handler.java 内

public class Handler implements View.OnTouchListener {
    public Handler(Context mContext,ListView lv) {
       lv.setOnTouchListener(this);
     }

     @Override
      public final boolean onTouch(View view, MotionEvent event) {
          switch (event.getAction()) {
        case MotionEvent.ACTION_MOVE: {
            System.out.println(" Motion ... ");
            break;
        }

        case MotionEvent.ACTION_DOWN: {
            System.out.println(" Motion Down ");
            break;
        }

        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP: {
            System.out.println(" Motion Up ");
            break;
        }
        }
        System.out.println("I am returning false");
        return false;
      }
     }

画像のonClickイベントをクリックすると、またはリストを移動すると、OnItemClickがアクティブになりました。非常に奇妙に見えます!!!

4

2 に答える 2

2

はい、それは呼び出されません。あなたができることは

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

        switch(event.getAction())
        {
        case MotionEvent.ACTION_DOWN:

            break;         
        case MotionEvent.ACTION_MOVE:

            break;   

        case MotionEvent.ACTION_UP:

            if(!mIsTouchHandeled){
                int position = mChatListView.pointToPosition((int) event.getX(), (int) event.getY());
                if(position!=ListView.INVALID_POSITION){
                    mChatListView.performItemClick(mChatListView.getChildAt(position-mChatListView.getFirstVisiblePosition()), position, mChatListView.getItemIdAtPosition(position));
                }
            }
            break;
        }           
        //       return super.onTouchEvent(event);       


        return false;
    }

}

基本的に、タッチ作業が完了していない場合は、PerformClick メソッドで OnItemClick を呼び出すことを確認しています。

それが役立つことを願っています

于 2014-03-31T12:46:33.187 に答える