2011-07-06 27 views
0

我的活動實現了OnTouchListener,它內部有一個ListView。 當用戶觸摸ListView時,我需要將ClickEvent分派給具有OnItemClickListener處理程序的ListView。當活動實現OnTOuchListener時調度點擊ListView

我該怎麼做?

編輯:ListView控件的

每個列表項具有的onTouchEvent處理程序。 ListView有onItemClick處理程序。

@Override 
    public boolean onTouch(View view, MotionEvent event) { 
     float actionUpX; 

     switch(event.getAction()){ 

     case MotionEvent.ACTION_DOWN: 
      actionDownX = event.getX(); 
      break; 

     case MotionEvent.ACTION_UP: 
      actionUpX = event.getX(); 

      mFlipper = (ViewFlipper) view.findViewById(R.id.view_listitem_flipper); 


      if(actionDownX < actionUpX){ 
       // |---> 
       mFlipper.showNext();     
      } else if(actionDownX > actionUpX){ 
       // <---| 
       mFlipper.showPrevious(); 
      } else { 
        //Click 
        //Need to dispatch itemClickEvent to ListView 

        //view.performClick(); this line causes StackOverflowException 
        } 
      break; 
     } 
     return true; 
    } 

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, 
     long id) { 
    //Need do an action using position of view 

} 

我的列表項是ViewFlipper,當用戶觸摸和拖拽項目,ViewFlipper需要執行 showNext或ShowPrevious和單一的點擊已經通過onItemClick

回答

2

如果你希望能夠單擊一個項目在列表中,有一些事情發生,你需要做類似如下:

public class YourClass extends ListActivity { 
    //Your Variables 
    ArrayList<Type> yourlist; 
    YourAdapterClass adapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     yourlist = new ArrayList<Type>(); 
     this.adapter = new YourAdapterClass(this, R.layout.row, yourlist); 
     setListAdapter(this.adapter); 

     //you might be able to see if the below works instead of overriding 
     //the OnListItemClickListener farther below 
     ListView lv = getListView(); 

     lv.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, 
            int position, long id) { 
       Log.i("testy", "I Clicked on Row " + position + " and it worked!"); 
      } 
     }); 
    } 

    @Override 
    /** 
    * When the user selects an item in the list, do an action 
    * @param ListView l 
    * @param View v 
    * @param int position 
    * @param long id 
    */ 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 

     final int index = position; 

     //You can add whatever you want to happen when you click here 

     Log.i("testy", "I Clicked on Row " + index + " and this overriding worked!"); 

    } 

//other methods can go here for you list 


} 

您還需要一個適配器類(在我的例子我適配器類被稱爲YourAdapterClass),則可以使這個私有類在ListActivty或類似下面的它自己的Java文件一個完全新的類:定製

public class YourAdapterClass extends ArrayAdapter { 
     protected ArrayList items; 

     public YourAdapterClass(Context context, int textViewResourceId, ArrayList items) { 
      super(context, textViewResourceId, items); 
      this.items = items; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View v = convertView; 

      if(v == null) { 
       LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       v = vi.inflate(R.layout.row, null); 
      } 

      //do stuff to your list view row if it is a custom row with multiple 
      //components like text views, image views etc. 

      return v; 


     } 
} 

通常這種方式用於自定義列表視圖(列表做成行,但你可以ñ使用它的正常看法以及)

希望這可以幫助你至少開始在正確的方向。

祝你好運。

(這是一個答案,我基本放棄了與此類似Custom ListVIew and onclick另一個線程)

+0

確定。但是我的listVew的每個項目都有onTouchEventListener。所以,當用戶點擊(而不是拖動)時,應該調用onListItemClick。 Ty – Rodrigo

+0

我不認爲你想使用onTouchEventListener,因爲這通常更多的是地圖視圖,當你有一個列表,並且用戶'觸摸'列表項時,它在技術上是'點擊',這就是爲什麼你想要使用onClick相關的東西。我知道這有點令人困惑,但我認爲你不應該爲你的listView使用onTouchEventListener,然後當用戶點擊它時應該調用onListItemClick,你應該可以做任何你想要的動作。另外,請確保您的列表行中沒有任何可聚焦或可點擊的項目,否則onListItemClick似乎不起作用。 – Wolfcow

+0

所以,我需要爲listItem實現2行爲:1 - 單擊(切換到另一個活動)。 2 - 拖動(listFrame的viewFlipper顯示項目的第二個佈局,顯示4個按鈕,每個按鈕都有不同的活動) – Rodrigo

0

來處理也許你的活動並不需要實現OnTouchListener?讓ListView處理觸摸事件。如果這不適合你,那麼在處理它之前考慮將觸摸事件傳遞給超類。這應該正確地發送事件或告訴你是否沒有人處理它。