仅使用OnTouchListener从ListView获取项目

时间:2013-06-29 19:51:32

标签: android android-listview ontouchlistener

在我的应用程序中,我的ListView有一个Touchlistener。使用TouchListener,我可以从触摸事件中获取X和Y坐标。现在我想从ListView获取被点击的项目。如何使用onTouchListener获取listView中单击项的位置?我不想使用onItemClickedListener。

4 个答案:

答案 0 :(得分: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 Jake Wharton

获得的

答案 1 :(得分:4)

答案 2 :(得分:3)

如果您使用TouchListener不是强制性的,我强烈建议您使用OnItemClickListener。它会大大简化你的生活。

除此之外,你必须得到ListView的当前偏移量和滚动位置,每行的高度,然后做一些数学运算来确定点(x,y)是否位于在每行的多边形中。由于行是矩形,数学并不太难,但使用OnItemClickListener会更容易。

此外,如果 需要使用TouchListener,您还可以使用OnItemClickListenerAdapter班级(或其他地方)设置值指示单击的最新项目。然后,在TouchListener中,您可以检查该值并使用它来关联(x,y)坐标和ListView项。当然,这取决于首先运行的OnItemClickListener。如果反之亦然,您可以使其工作,但使用TouchListener存储触摸位置,然后将其与OnItemClickListener相关联。

答案 3 :(得分: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.
    }