4

在我的活动中,我有一个列表视图,为此我同时拥有onItemClickListeneronTouchListener。当我在我的list.OnTouch方法中单击一行时,调用MotionEvent Downand 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 事件。所以,我尝试在 imageView 中将 android:focusable 和 android:focusableInTouchMode 设置为 false。但没有成功。

在 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 回答
0

你应该返回 super.onTouchEvent(event); 而不是我返回假。通过返回 false ,您是在告诉系统您不希望 View 的触摸事件,因此 onClickEvent 将被忽略。

于 2013-07-29T11:37:49.923 回答