2013-06-29 36 views
4

在我的應用程序中,我的ListView有一個Touchlistener。使用TouchListener,我可以從觸摸事件中獲取X和Y座標。現在我想從ListView中獲取點擊的項目。我如何才能在listView中使用onTouchListener獲取單擊項目的位置?我不想使用onItemClickedListener。從ListView中獲取項目只能使用OnTouchListener

+0

使用標籤的最佳方式getView'方法並檢索標籤'onTouch'事件http://stackoverflow.com/a/10228723/1276374 –

回答

19
switch (motionEvent.getActionMasked()) { 
      case MotionEvent.ACTION_DOWN: { 
       if (mPaused) { 
        return false; 
       } 

       // TODO: ensure this is a finger, and set a flag 

       // Find the child view that was touched (perform a hit test) 
       Rect rect = new Rect(); 
       int childCount = mListView.getChildCount(); 
       int[] listViewCoords = new int[2]; 
       mListView.getLocationOnScreen(listViewCoords); 
       int x = (int) motionEvent.getRawX() - listViewCoords[0]; 
       int y = (int) motionEvent.getRawY() - listViewCoords[1]; 
       View child; 
       for (int i = 0; i < childCount; i++) { 
        child = mListView.getChildAt(i); 
        child.getHitRect(rect); 
        if (rect.contains(x, y)) { 
         mDownView = child; // This is your down view 
         break; 
        } 
       } 

       if (mDownView != null) { 
        mDownX = motionEvent.getRawX(); 
        mDownPosition = mListView.getPositionForView(mDownView); 

        mVelocityTracker = VelocityTracker.obtain(); 
        mVelocityTracker.addMovement(motionEvent); 
       } 
       view.onTouchEvent(motionEvent); 
       return true; 
      } 

我來自SwipeListView Jake Wharton

+5

這工作真的很好,但如果我在ListView中向下滾動,我會看到錯誤的視圖。即使我在ListView中向下滾動,我如何實現邏輯來獲得真實的項目? – Cilenco

+0

感謝您的解決方案,它在我的自定義列表視圖中工作得很好 – user2138983

+0

我正在用自定義視圖來測試它,它很棒! – nemesisfixx

3

如果不是強制使用TouchListener,我強烈建議使用OnItemClickListener。它會大大簡化你的生活。

除此之外,你必須得到ListView的當前偏移量和滾動位置,每行的高度,然後做一些數學運算來確定點(x,y)是否位於每個點的多邊形中行。由於行是矩形,數學不是太困難,但使用OnItemClickListener會更容易。

此外,如果您需要使用TouchListener,你也可以使用OnItemClickListener設置你的Adapter類的值(或其他地方)表示最近項目點擊。然後,在您的TouchListener中,您可以檢查該值,並使用它來關聯(x,y)座標和ListView項目。這當然取決於OnItemClickListener首先運行。如果反過來,您可以使其工作,但使用TouchListener存儲觸摸位置,然後將其關聯到OnItemClickListener

1

你的類可以實現'兩個View.OnTouchListener, AdapterView.OnItemClickListener

@Override 
public boolean onTouch(View view, MotionEvent motionEvent) { 
    if(motionEvent.getAction() == MotionEvent.ACTION_UP){ 
     Log.d(TAG, "ontouch: UP"); 

    **// Here you can figure if it was simple item click event. 
     // We return false only when user touched once on the view. 
     // this will be handled by onItemClick listener.** 

     if(lastAction == -1){ 
      lastAction = MotionEvent.ACTION_UP; 
      view.clearFocus(); 
      return true; 
     } 
     return false; 
    } 
    else if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){ 
     Log.d(TAG, "ontouch: DOWN"); 
     return false; 
    } 
    else { 
     // This is all action events. 
     lastAction = -1; 
     return true; 
    } 
} 



@Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    // We come here after onTouch event figured out that its a simple touch event and needs to be handled here. 
    } 
相關問題