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 回答
4

使用此方法的最佳方法pointToPosition(int x, int y)pointToRowId(int x, int y)

于 2014-10-16T13:16:50.963 回答
2

如果您不强制使用 a TouchListener,我强烈建议您使用OnItemClickListener. 它将大大简化您的生活。

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

此外,如果您确实需要使用TouchListener,您还可以使用OnItemClickListener在您的类(或其他地方)上设置一个值,Adapter指示最近点击的项目。然后,TouchListener您可以检查该值并使用它来关联 (x,y) 坐标和ListView项目。当然,这取决于OnItemClickListener首先运行。如果反之为真,则可以使其工作,而是将触摸位置存储在使用 中TouchListener,然后将其关联到OnItemClickListener.

于 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 回答