5

私のアプリケーションには、ListView 用の Touchlistener があります。TouchListener を使用すると、タッチ イベントから X 座標と Y 座標を取得できます。ここで、クリックされた項目を ListView から取得したいと考えています。onTouchListener のみを使用して listView 内のクリック項目の位置を取得するにはどうすればよいですか? onItemClickedListener を使用したくありません。

4

4 に答える 4

21
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 ジェイク ウォートンから取得します

于 2013-06-29T20:24:55.737 に答える
2

を使用することが必須でない場合はTouchListener、 を使用することを強くお勧めしますOnItemClickListener。それはあなたの人生を大幅に簡素化します。

それ以外に、現在のオフセットとスクロール位置、ListView各行の高さを取得し、計算を行って点 (x,y) が各行のポリゴンにあるかどうかを判断する必要があります。行は四角形であるため、数学はそれほど難しくありませんが、使用OnItemClickListenerするのははるかに簡単です。

さらに、 を使用する必要がある場合、 を使用して、最後にクリックされた項目を示す値をクラス (または別の場所)に設定するTouchListenerこともできます。次に、その値を確認し、それを使用して (x,y) 座標とアイテムを関連付けることができます。もちろん、これは最初に実行されるものに依存します。逆が真の場合、それを機能させることができますが、代わりに を使用してタッチ位置を保存し、で関連付けます。OnItemClickListenerAdapterTouchListenerListViewOnItemClickListenerTouchListenerOnItemClickListener

于 2013-06-29T19:59:29.540 に答える
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.
    }
于 2017-06-21T07:11:39.180 に答える