2016-03-27 35 views
0

我有一個應該處理觸摸的容器View。它有Listview,覆蓋範圍爲onTouch(),返回false(當容器通過刷卡擴展時,將返回true)。當Listview觸摸發生時,它傳遞到容器View,一切都很好。但我需要爲Listview的項目添加點擊處理。在ListView中拖動的Android觸摸事件

當我設置爲onClickListener項目,我在日誌中看到它沒有MotionEvent傳遞給容器,它ListViewonTouch()(返回false和什麼都不做)是stucked。我想爲這樣的項目設置onTouchListener

viewHolder.itemLayout.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        return true; 

       case MotionEvent.ACTION_MOVE: 
        return false; 

       case MotionEvent.ACTION_UP: 
        Log.d(TAG, "something like click detected"); 
        return true; 
      } 
      return false; 
     } 
    }); 

但是結果是一樣的。有人可以解釋爲什麼我的集裝箱沒有收到觸摸事件,即使ListView返回false因爲它的優先onTouch()

+0

我相信你可以直接使用OnItemClickListener來處理點擊listview項目 – sharan

回答

0

如果要處理的ListView的項目的點擊次數:使用OnItemClickListener

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      //parent.getItemAtPosition(position) returns the value of item clicked.. use it to do whatever you wish to do 
     } 
    }); 
+0

真正的問題是在我們決定這個事件對我們在listview項目中不感興趣後,真正的問題是將觸摸事件從listview傳遞到它的容器。 –

1

我大約2個星期前有同樣的問題。從listview的onTouch方法返回false沒有將事件傳遞給父容器。我結束了這樣做: 1.您需要自定義佈局爲您的容器View。然後在該視圖中,覆蓋onInterceptTouchEvent,例如像這樣:

@Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     switch (ev.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       previousX_actionDOWN = ev.getRawX(); 
       isOnClick = true; 
       timePressed = System.currentTimeMillis(); 
       return false; 
      case MotionEvent.ACTION_MOVE: 
       if (isOnClick && (Math.abs(previousX_actionDOWN - ev.getRawX()) > SCROLL_THRESHOLD)) { 
        return true; 
       } else { 
        return false; 
       } 
      case MotionEvent.ACTION_UP: 
       if (!wasDragged) { 
        return false; 
       } 
       else { 
        return true; 
       } 
     } 
     return false; 
    } 

我也有這種觀點複雜onTouch方法,但它不值得粘貼。要點是,如果在ACTION_MOVE傳遞某個閾值時,您的父視圖應該只攔截觸摸事件 - 至少這是我想要實現的。然後在你的listview中,你只需實現標準onItemClickListener而不是onTouch。